通过AutoFixture向私有二传手测试数据填充公共财产

时间:2018-01-01 12:45:16

标签: c# unit-testing autofixture

我想测试ConfirmDownloadInvoiceDate方法。另外,我想用Order属性的ConfirmationDownloadInvoiceDate属性创建fixture.Create<Order>(); 个对象:

Order

我的public class Order { public DateTime? ConfirmationDownloadInvoiceDate { get; private set; } public void ConfirmDownloadInvoiceDate(IDateTimeProvider timeProvider) { if (ConfirmationDownloadInvoiceDate == null) { ConfirmationDownloadInvoiceDate = timeProvider.Now(); } } } 课程:

ISpecimenBuilder

是否可以用测试数据填充该属性?我试过从 get facebook mutual friend with app user or non app user $access_token = "facebook user token"; $facebook_id = "friend id"; $app_secret = "facebook secret"; $appsecret_proof = hash_hmac('sha256', $access_token, $app_secret); $graph_url = "https://graph.facebook.com/" . $facebook_id . "?fields=context.fields(all_mutual_friends.fields(id,name,picture.width(200).height(200)))" . "&access_token=" . $access_token . "&appsecret_proof=" . $appsecret_proof; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $graph_url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); $output = curl_exec($ch); return $response_mutual = json_decode($output, true); curl_close($ch); 创建新类,但似乎它不起作用。

1 个答案:

答案 0 :(得分:2)

按照设计,AutoFixture只会在他们可以公开写入时填写字段和属性,因为这是您自己作为客户端开发人员可以做的事情,如果您不使用AutoFixture编写测试数据手工安排阶段。在上面的Order类中,ConfirmationDownloadInvoiceDate属性没有公共设置器,因此AutoFixture将忽略它。

显然,最简单的解决方法是将公钥设为公开,但这并不总是有道理。

在这种特殊情况下,您可以通过告诉AutoFixture在创建Order个对象时应调用ConfirmDownloadInvoiceDate方法来自定义Order类的创建。

这样做的一种方法是首先创建IDateTimeProvider的特定于测试的Stub实现,例如:

public class StubDateTimeProvider : IDateTimeProvider
{
    public StubDateTimeProvider(DateTime value)
    {
        this.Value = value;
    }

    public DateTime Value { get; }

    public DateTime Now()
    {
        return this.Value;
    }
}

您还可以使用动态模拟库,如Moq,NSubstitute等。

使用存根调用ConfirmDownloadInvoiceDate方法,例如:

[Fact]
public void AutoFillConfirmationDownloadInvoiceDate()
{
    var fixture = new Fixture();
    fixture.Customize<Order>(c => c
        .Do(o => o.ConfirmDownloadInvoiceDate(fixture.Create<StubDateTimeProvider>())));

    var actual = fixture.Create<Order>();

    Assert.NotNull(actual.ConfirmationDownloadInvoiceDate);
    Assert.NotEqual(default(DateTime), actual.ConfirmationDownloadInvoiceDate);
}

此测试通过。您应该考虑在ICustomization类中打包上述自定义。