用Moq模擬擴(kuò)展方法我有一個(gè)預(yù)先存在的界面......public interface ISomeInterface{
void SomeMethod();}并且我使用mixin擴(kuò)展了這個(gè)表面...public static class SomeInterfaceExtensions{
public static void AnotherMethod(this ISomeInterface someInterface)
{
// Implementation here
}}我有一個(gè)叫這個(gè)我要測(cè)試的課程...public class Caller{
private readonly ISomeInterface someInterface;
public Caller(ISomeInterface someInterface)
{
this.someInterface = someInterface;
}
public void Main()
{
someInterface.AnotherMethod();
}}和測(cè)試,我想模擬界面并驗(yàn)證對(duì)擴(kuò)展方法的調(diào)用... [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();
}然而,運(yùn)行此測(cè)試會(huì)產(chǎn)生異常......System.ArgumentException: Invalid setup on a non-member method:x => x.AnotherMethod()我的問題是,有一個(gè)很好的方法來(lái)模擬混合調(diào)用嗎?
3 回答

阿晨1998
TA貢獻(xiàn)2037條經(jīng)驗(yàn) 獲得超6個(gè)贊
你不能用模擬框架“直接”模擬靜態(tài)方法(因此擴(kuò)展方法)。您可以嘗試Moles(http://research.microsoft.com/en-us/projects/pex/downloads.aspx),這是Microsoft提供的一種免費(fèi)工具,可以實(shí)現(xiàn)不同的方法。以下是該工具的說明:
Moles是.NET中基于委托的測(cè)試存根和繞道的輕量級(jí)框架。
Moles可用于繞過任何.NET方法,包括密封類型中的非虛擬/靜態(tài)方法。
您可以將Moles與任何測(cè)試框架一起使用(它與此無(wú)關(guān))。

慕后森
TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超5個(gè)贊
我用過Wrapper來(lái)解決這個(gè)問題。創(chuàng)建一個(gè)包裝器對(duì)象并傳遞您的模擬方法。
請(qǐng)參閱Paul Irwin的“ 用于單元測(cè)試的模擬靜態(tài)方法”,它有很好的例子。
- 3 回答
- 0 關(guān)注
- 746 瀏覽
添加回答
舉報(bào)
0/150
提交
取消