请解释一下Customize和Register在功能上的区别,什么时候使用其中一种。下面的TestCustomize示例失败,TestRegister通过。我希望定制脚本能够正常工作。它用英语读到:“当生成一个HttpClient时,在提供样本之前在它上使用一个后处理的lambda”。
但是我得到的是一个包含GUID的HTTP地址,显然是由AutoFixture生成的。
[Fact]
public void TestCustomize()
{
var fixture = new Fixture();
fixture.Customize<HttpClient>(c =>
{
//c.OmitAutoProperties(); makes no difference
c.Do(x => x.BaseAddress = new Uri("http://myval"));
return c;
});
var client = fixture.Create<HttpClient>();
Assert.Equal("http://myval/", client.BaseAddress.ToString());
}
[Fact]
public void TestRegister()
{
var fixture = new Fixture();
fixture.Register(() => new HttpClient
{
BaseAddress = new Uri("http://myval")
});
var client = fixture.Create<HttpClient>();
Assert.Equal("http://myval/", client.BaseAddress.ToString());
}发布于 2017-12-24 09:37:26
这与Customize和Register无关。实际上,如果您查看Register,您会发现它只是Customize上的一种方便的方法。
问题在于Do的使用。如果您查看Do的签名,您将看到它具有以下类型:
IPostprocessComposer<T> Do(Action<T> action)注意,该方法返回一个值。在函数式中,或者,如果您愿意的话,遵循命令查询分离,该方法不会对其定义的实例进行变异,而是返回一个新对象,该对象的行为发生了变化。
当你写到:
c.Do(x => x.BaseAddress = new Uri("http://myval"));一个人立即放弃返回值与改变的行为。在F#或Haskell等语言中,如果编写这样的代码,就会得到编译时通知,告诉您将忽略函数调用的返回值,但C#不会这样做。
在任何情况下,AutoFixture的API都设计为fluent接口。目的是让您将链式方法调用到一起:
fixture.Customize<HttpClient>(c => c
.Without(x => x.BaseAddress)
.Do(x => x.BaseAddress = new Uri("http://myval")));您仍然需要Without (或者,如果需要的话,还需要OmitAutoProperties)来关闭默认的自动属性行为,因为否则,BaseAddress将被自动属性功能覆盖。
此版本的测试通过:
[Fact]
public void TestCustomize()
{
var fixture = new Fixture();
fixture.Customize<HttpClient>(c => c
.Without(x => x.BaseAddress)
.Do(x => x.BaseAddress = new Uri("http://myval")));
var client = fixture.Create<HttpClient>();
Assert.Equal("http://myval/", client.BaseAddress.ToString());
}https://stackoverflow.com/questions/47840471
复制相似问题