亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

用Moq模擬擴展方法

用Moq模擬擴展方法

SMILET 2019-08-13 09:49:14
用Moq模擬擴展方法我有一個預先存在的界面......public interface ISomeInterface{     void SomeMethod();}并且我使用mixin擴展了這個表面...public static class SomeInterfaceExtensions{     public static void AnotherMethod(this ISomeInterface someInterface)     {         // Implementation here     }}我有一個叫這個我要測試的課程...public class Caller{     private readonly ISomeInterface someInterface;     public Caller(ISomeInterface someInterface)     {         this.someInterface = someInterface;     }     public void Main()     {         someInterface.AnotherMethod();     }}和測試,我想模擬界面并驗證對擴展方法的調用...    [Test]     public void Main_BasicCall_CallsAnotherMethod()     {         // Arrange         var someInterfaceMock = new Mock<ISomeInterface>();         someInterfaceMock.Setup(x => x.AnotherMethod()).Verifiable();         var caller = new Caller(someInterfaceMock.Object);         // Act         caller.Main();         // Assert         someInterfaceMock.Verify();     }然而,運行此測試會產生異常......System.ArgumentException: Invalid setup on a non-member method:x => x.AnotherMethod()我的問題是,有一個很好的方法來模擬混合調用嗎?
查看完整描述

3 回答

?
阿晨1998

TA貢獻2037條經驗 獲得超6個贊

你不能用模擬框架“直接”模擬靜態方法(因此擴展方法)。您可以嘗試Moles(http://research.microsoft.com/en-us/projects/pex/downloads.aspx),這是Microsoft提供的一種免費工具,可以實現不同的方法。以下是該工具的說明:

Moles是.NET中基于委托的測試存根和繞道的輕量級框架。

Moles可用于繞過任何.NET方法,包括密封類型中的非虛擬/靜態方法。

您可以將Moles與任何測試框架一起使用(它與此無關)。


查看完整回答
反對 回復 2019-08-13
?
慕后森

TA貢獻1802條經驗 獲得超5個贊

我用過Wrapper來解決這個問題。創建一個包裝器對象并傳遞您的模擬方法。

請參閱Paul Irwin的“ 用于單元測試模擬靜態方法”,它有很好的例子。


查看完整回答
反對 回復 2019-08-13
  • 3 回答
  • 0 關注
  • 749 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號