我有关于AutoFixture的以下问题,在代码中解释
public SUT(IConcrete concrete)
{
DTO BuildDTO()
{
return new DTO
{
URL = concrete.GetString(arg1, arg2);
};
}
}
public Concrete : IConcrete
{
public Concrete(ISomeHandler someHandler)
{
...
}
public GetString(obj arg1, obj arg2)
{
return someHandler.GetUri(arg1, arg2);
}
}
public void Test(
[Frozen] Mock<ISomeHandler> someHandler,
SUT mySUT)
{
someHandler.Setup(...);
mySUT.DoStuff();
//assert everything went as expected
}
我的问题很简单,如何使用AutoFixture注册IConcrete,以便我可以访问应该在测试用例中注入的冻结模拟?
实际上,这是关于将HttpRequestMessage注入URL解析器,该解析器在Handler中使用,从Web API项目中的控制器调用。
我试图用自动混合创建模拟
来注册IConcretefixture.Register<IConcrete>(new Mock<ISomeHandler>());
但是我无法在单元测试中访问此模拟并设置返回值。
提前感谢您提供任何帮助:)
答案 0 :(得分:3)
为了允许AutoFixture生成模拟,需要启用AutoMocking Container。
您需要执行以下操作:
创建AutoMoqAttribute
:
public class AutoMoqDataAttribute : AutoDataAttribute
{
public AutoMoqDataAttribute()
: base(new Fixture().Customize(new AutoMoqCustomization()))
{
}
}
使用新属性装饰您的测试:
[Theory, AutoMoqData]
public void Test(
[Frozen] Mock<ISomeHandler> someHandler,
Sut sut)
{
someHandler.Setup(s => s.DoStuff()).Returns("123");
Assert.Equal("123", sut.SomeHandler.DoStuff());
}
Sut
和ISomeHandler
如下:
public class Sut
{
public Sut(ISomeHandler someHandler)
{
SomeHandler = someHandler;
}
public ISomeHandler SomeHandler { get; }
}
public interface ISomeHandler
{
string DoStuff();
}