gpt4 book ai didi

moq - 处理 AutoFixture 和 Moq 之间的样本创建不一致

转载 作者:行者123 更新时间:2023-12-04 14:34:57 27 4
gpt4 key购买 nike

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

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

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

这解决了为什么,但我该怎么办?有没有办法指导起订量如何处理 ThingOne或者有没有办法指示 AutoFixture 忽略 IThingBuilders 的起订量而是做一些Fixtury?

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());
}
}

最佳答案

由于 Moq 中没有可扩展点使 AutoFixture 能够 Hook 并提供 ThingOne 的值。 ,你能做的并不多。

但是,您可以使用 SetReturnsDefault<T>起订量的方法。修改上面的测试将是这样的:

[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 以便为该返回类型设置默认值。不是特别灵活。

关于moq - 处理 AutoFixture 和 Moq 之间的样本创建不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18497489/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com