Unit testing 使用在具体实现中创建的自动夹具
我有以下关于AutoFixture的问题,在代码中解释Unit testing 使用在具体实现中创建的自动夹具,unit-testing,autofixture,Unit Testing,Autofixture,我有以下关于AutoFixture的问题,在代码中解释 public SUT(IConcrete concrete) { DTO BuildDTO() { return new DTO { URL = concrete.GetString(arg1, arg2); }; } } public Concrete : IConcrete { public Concrete(ISomeH
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
}
公共SUT(混凝土)
{
DTO BuildDTO()
{
返回新DTO
{
URL=concrete.GetString(arg1,arg2);
};
}
}
公共混凝土:IConcrete
{
公共混凝土(等径混凝土)
{
...
}
公共GetString(对象arg1、对象arg2)
{
返回someHandler.GetUri(arg1,arg2);
}
}
公共空隙试验(
[冻结]模拟处理程序,
苏特迈苏特)
{
someHandler.Setup(…);
mySUT.DoStuff();
//一切如期进行
}
我的问题很简单,我如何用AutoFixture注册IConcrete,这样我就可以访问冻结的mock,该mock应该在测试用例中注入它
实际上,这是关于将HttpRequestMessage注入URL解析程序,该解析程序用于处理程序,从Web API项目中的控制器调用
我已尝试使用自动夹具创建的模拟来注册IContrace
fixture.Register<IConcrete>(new Mock<ISomeHandler>());
fixture.Register(新Mock());
但是,我无法在单元测试中访问此模拟并设置返回值
提前感谢所有帮助:)为了允许自动夹具生成模拟,需要启用该功能 您需要执行以下操作:
public class Sut
{
public Sut(ISomeHandler someHandler)
{
SomeHandler = someHandler;
}
public ISomeHandler SomeHandler { get; }
}
public interface ISomeHandler
{
string DoStuff();
}
自动moqAttribute
:
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
依赖于IConcrete
,那么为什么还要关心ISomeHandler
?我关心ISomeHandler,因为它正在输出url,我想验证它是否正确生成。在提供的代码中,SUT
和isomHandler
之间没有交互SUT
仍然不与isomHandler
交互。它调用IConcrete.GetString
。您只需要为IConcrete
提供一个双重测试。谢谢Mark-我意识到我需要自己测试IConcrete,然后在这种情况下使用SUT,我可以使用autofixture生成的URL,因为我知道IConcrete本身将生成正确的URL。