在具体实现中使用 AutoFixture 创建的 mock
Using a AutoFixture created mock in a concrete implementation
我有以下关于 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 解析器,该解析器在处理程序中使用,从 Web API 项目中的控制器调用。
我已尝试使用创建的模拟自动夹具注册 IConcrete
fixture.Register<IConcrete>(new Mock<ISomeHandler>());
但是我无法在单元测试中访问此模拟并设置 return 值。
在此先感谢您提供的所有帮助:)
为了允许 AutoFixture 生成 mocks,需要启用 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();
}
我有以下关于 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 解析器,该解析器在处理程序中使用,从 Web API 项目中的控制器调用。
我已尝试使用创建的模拟自动夹具注册 IConcrete
fixture.Register<IConcrete>(new Mock<ISomeHandler>());
但是我无法在单元测试中访问此模拟并设置 return 值。
在此先感谢您提供的所有帮助:)
为了允许 AutoFixture 生成 mocks,需要启用 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();
}