我想测试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);
创建新类,但似乎它不起作用。
答案 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
类中打包上述自定义。