【问题标题】:Handling specimen creation inconsistencies between AutoFixture and Moq处理 AutoFixture 和 Moq 之间的样本创建不一致
【发布时间】:2013-08-28 20:22:09
【问题描述】:

我在我的测试约定中使用 AutoMoqCustomization。

考虑下面的代码。在我向其中一个具体类添加构造函数之前,一切都很好。当我这样做时,我得到“找不到无参数构造函数”。我们知道 AutoFixture 对构造函数没有问题,因为它为我提供了测试对象one,该对象被证明可以从 IThings 分配……那里没有失败。所以一定是最小起订量。

这是有道理的,因为我假设 builder 由 moq 生成并传递给 GetCommands 方法。所以我想我可以看到控制权已经从 AutoFixture 传递到了 moq。

这说明了原因,但我应该怎么做呢?有没有办法指示起订量如何处理ThingOne,或者有没有办法指示 AutoFixture 忽略IThingBuilders 的起订量,而是做一些固定?

public class TestClass
{
    public interface IThingBuilders
    {
        T1 Build<T1>() where T1 : IThings;
    }
    public interface IThings
    {
    }
    public class ThingOne : IThings
    {
        public ThingOne(string someparam)
        {
        }
    }
    public class ThingTwo : IThings
    {
    }
    public class SomeClass
    {
        public List<IThings> GetCommands(IThingBuilders builder)
        {
            var newlist = new List<IThings>();
            newlist.Add(builder.Build<ThingOne>());
            newlist.Add(builder.Build<ThingTwo>());
            return newlist;
        }
    }
    [Theory, BasicConventions]
    public void WhyCannotInstantiateProxyOfClass(ThingOne one, ThingTwo two, IThingBuilders builder, SomeClass sut)
    {
        Assert.IsAssignableFrom<IThings>(one);
        Assert.IsAssignableFrom<IThings>(two);

        var actual = sut.GetCommands(builder);

        Assert.Equal(1, actual.OfType<ThingOne>().Count());
        Assert.Equal(1, actual.OfType<ThingTwo>().Count());
    }
}

【问题讨论】:

  • 这个answer 可能会有所帮助。

标签: moq autofixture


【解决方案1】:

由于 Moq 中没有可让 AutoFixture 挂钩并提供 ThingOne 值的扩展点,因此您无能为力。

但是,您可以使用 Moq 的 SetReturnsDefault&lt;T&gt; 方法。修改上面的测试会是这样的:

[Theory, BasicConventions]
public void WhyCannotInstantiateProxyOfClass(
    ThingOne one, ThingTwo two, IThingBuilders builder, SomeClass sut)
{
    Assert.IsAssignableFrom<IThings>(one);
    Assert.IsAssignableFrom<IThings>(two);
    Mock.Get(builder).SetReturnsDefault(one); // Add this to make the test pass

    var actual = sut.GetCommands(builder);

    Assert.Equal(1, actual.OfType<ThingOne>().Count());
    Assert.Equal(1, actual.OfType<ThingTwo>().Count());
}

这比编写特定的Setup/Returns 对要容易一些,但并不多。您可以将该代码移至 AutoFixture 自定义,但同样,由于这是 Mock 实例上的通用方法,您将明确需要调用它,例如ThingOne 以设置该返回类型的默认值。不是特别灵活。

【讨论】:

    猜你喜欢
    • 2022-08-22
    • 2015-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-17
    • 2011-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多