在我使用AutoFixture的前几天,我可能已经做了以下安排来设置一个名为CustomerService
的服务的单元测试:
public void TestName()
{
//Arrange
var fakeResponse = new DerivedHttpResponse();
var fakeHandler = new FakeHttpMessageHandler(fakeResponse); // takes HttpResponse
var httpClient = new HttpClient(fakeHandler);
var sut = new CustomerService(httpClient);
// ...
}
这种冗长的安排似乎是AutoFixture善于解决的问题。我想我可以用AutoFixture重写那个排列,看起来像这样:
public void TestName([Frozen] DerivedHttpResponse response, CustomerService sut)
{
//Nothing to arrange
// ...
}
我的问题是,有没有办法配置AutoFixture为我做这个,因为我有很多派生HttpResponse
类型,我想从测试方法换成测试方法?
答案 0 :(得分:5)
您可以将[Frozen]
属性与命名参数As
:
[Theory, AutoData]
public void TestName(
[Frozen(As = typeof(HttpResponse))] DerivedHttpResponse response,
CustomerService sut)
{
// 'response' is now the same type, and instance,
// with the type that the SUT depends on.
}
命名参数As
指定冻结参数值应映射到的类型。
如果HttpResponse
类型是抽象的,您必须创建AutoDataAttribute
派生类型,例如AutoWebDataAttribute
public class AutoWebDataAttribute : AutoDataAttribute
{
public AutoWebDataAttribute()
: base(new Fixture().Customize(new WebModelCustomization()))
{
}
}
public class WebModelCustomization : CompositeCustomization
{
public WebModelCustomization()
: base(
new AutoMoqCustomization())
{
}
}
在这种情况下,您将使用[AutoWebData]
代替。