为了账号安全,请及时绑定邮箱和手机立即绑定

用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 关注
  • 661 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信