首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Fixture.Customize对Fixture.Register

Fixture.Customize对Fixture.Register
EN

Stack Overflow用户
提问于 2017-12-15 22:04:39
回答 1查看 2.6K关注 0票数 4

请解释一下CustomizeRegister在功能上的区别,什么时候使用其中一种。下面的TestCustomize示例失败,TestRegister通过。我希望定制脚本能够正常工作。它用英语读到:“当生成一个HttpClient时,在提供样本之前在它上使用一个后处理的lambda”。

但是我得到的是一个包含GUID的HTTP地址,显然是由AutoFixture生成的。

代码语言:javascript
复制
[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());
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-24 09:37:26

这与CustomizeRegister无关。实际上,如果您查看Register,您会发现它只是Customize上的一种方便的方法。

问题在于Do的使用。如果您查看Do的签名,您将看到它具有以下类型:

代码语言:javascript
复制
IPostprocessComposer<T> Do(Action<T> action)

注意,该方法返回一个值。在函数式中,或者,如果您愿意的话,遵循命令查询分离,该方法不会对其定义的实例进行变异,而是返回一个新对象,该对象的行为发生了变化。

当你写到:

代码语言:javascript
复制
c.Do(x => x.BaseAddress = new Uri("http://myval"));

一个人立即放弃返回值与改变的行为。在F#或Haskell等语言中,如果编写这样的代码,就会得到编译时通知,告诉您将忽略函数调用的返回值,但C#不会这样做。

在任何情况下,AutoFixture的API都设计为fluent接口。目的是让您将链式方法调用到一起:

代码语言:javascript
复制
fixture.Customize<HttpClient>(c => c
    .Without(x => x.BaseAddress)
    .Do(x => x.BaseAddress = new Uri("http://myval")));

您仍然需要Without (或者,如果需要的话,还需要OmitAutoProperties)来关闭默认的自动属性行为,因为否则,BaseAddress将被自动属性功能覆盖。

此版本的测试通过:

代码语言:javascript
复制
[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());
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47840471

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档