首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AutoFixture和fluent Moq语法

AutoFixture和fluent Moq语法
EN

Stack Overflow用户
提问于 2015-04-23 00:26:29
回答 2查看 1.7K关注 0票数 5

我使用Moq已经有一段时间了,为了简洁起见,我经常使用Mock.Of的流利语法来表示设置.

代码语言:javascript
复制
var foo = Mock.Of<IFoo>(f => f.Method(It.IsAny<string>()) == 7 && f.Property == "Hi");
var sut = new Whatever(foo);

最近,我开始使用AutoFixture,似乎找不到任何相同的语法来同时表达多个设置。我知道我可以用Freeze来表达同样的事情.

代码语言:javascript
复制
var foo = fixture.Freeze<Mock<IFoo>>();
foo.Setup(f => f.Method(It.IsAny<string>()).Returns(7);
foo.Setup(f => f.Property).Returns("Hi");
var sut = fixture.Create<Whatever>();

...but (如果可能的话),我希望获得自动锁定的好处,并保持流畅的Moq设置的简洁性。撇开风格上的争论不谈,AutoFixture有没有为我提供任何方法来流畅地表达这些设置?如果没有,我是否可以使用任何优化来使AutoFixture设置更加简洁?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-23 08:31:17

您可以使用Moq的fluent API自己创建模拟,然后将其插入到夹具中:

代码语言:javascript
复制
var foo = Mock.Of<IFoo>(f => f.Method(It.IsAny<string>()) == 7 && f.Property == "Hi");
fixture.Inject(foo);

var sut = fixture.Create<Whatever>();

如果您使用的是AutoMoqCustomization,那么上面的代码将执行与您发布的代码相同的操作,除了不设置CallBase = trueDefaultValue = DefaultValue.Mock;之外。

如果您使用的是AutoConfiguredMoqCustomization,则此代码将不会设置任何其他成员,而定制将设置任何成员。如果您想获得AutoConfiguredMoqCustomization的好处并使用Moq的fluent API,恐怕这是不可能的。

票数 5
EN

Stack Overflow用户

发布于 2015-04-23 09:00:09

在@dcastro的回答上翻翻,一个小包装,上面所包含的同样的警告:-

代码语言:javascript
复制
public static T SetMock<T>(this IFixture that, Expression<Func<T, bool>> expr)
    where T : class
{
    var mocked = Mock.Of(expr);
    that.Inject(mocked);
    return mocked;
}

允许你:

代码语言:javascript
复制
fixture.SetMock<IFoo>(f => 
    f.Method(It.IsAny<string>()) == 7 
    && f.Property == "Hi");

或者,如果你对具体的价值感兴趣:

代码语言:javascript
复制
var foo = fixture.SetMock<IFoo>(f => 
    f.Method(It.IsAny<string>()) == 7 
    && f.Property == "Hi");

没有助手的最干净的C#是:

代码语言:javascript
复制
fixture.Inject( Mock.Of<IFoo>( f => 
    f.Method(It.IsAny<string>()) == 7 
    && f.Property == "Hi")));

如果您是在F#中进行测试,在福克中,您可以将其写成:

代码语言:javascript
复制
Mock<IFoo>.With(fun x ->
    <@  x.Method(any()) --> 7
        x.Property --> "Hi" @>)
|> fixture.Inject

( -->右边的表达式只是代码,即您可以在其中放置算法内容,然后在编写它时获得intellisense和类型检查)。或(仍然使用Foq):

代码语言:javascript
复制
fixture.Inject <|
    Mock<IFoo>.With(fun x -> <@  
        x.Method(any()) --> 7
        x.Property --> "Hi" @>)

或者(假设接口完全实现是合理的),您可以使用F#对象表达式:

代码语言:javascript
复制
fixture.Inject { new IFoo with 
    member x.Method _ = 7 
    member x.Property with get() = "Hi" }
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29811400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档