一尘不染

如何使用Moq模拟扩展方法?

c#

我正在编写一个依赖于扩展方法结果的测试,但我不希望该扩展方法的将来失败会破坏该测试。模拟该结果似乎是显而易见的选择,但是
Moq似乎没有提供重写静态方法
(扩展方法的要求)的方法。Moq.Protected和Moq.Stub也有类似的想法,但是在这种情况下他们似乎没有提供任何帮助。我是否缺少某些东西,还是应该以其他方式处理?

这是一个简单的示例,但失败了,并出现了常见的 “对不可覆盖成员的无效期望” 。这是一个需要模拟扩展方法的糟糕示例,但应该这样做。

public class SomeType {
    int Id { get; set; }
}

var ListMock = new Mock<List<SomeType>>();
ListMock.Expect(l => l.FirstOrDefault(st => st.Id == 5))
        .Returns(new SomeType { Id = 5 });

至于可能建议我使用隔离器的所有TypeMock迷:我很感谢所做的努力,因为看起来TypeMock可以蒙住双眼和令人生厌,但我们的预算不会很快增加。


阅读 468

收藏
2020-05-19

共1个答案

一尘不染

扩展方法只是伪装的静态方法。Moq或Rhinomocks之类的模拟框架只能创建对象的模拟实例,这意味着无法模拟静态方法。

2020-05-19