我正在尝试创建一个简单的 Xunit 测试,它将采用一个属性(不是 property.name,而是完整的属性)作为数据类型。
我已经查看了三种可用类型,因此我可以作为内联/成员/类数据传递,但它们都不适合。
我的属性是这样创建的
TokenStore nullTokenStore { get; set; } = new TokenStore();
TokenStore tokenStore { get; set; } = new TokenStore { RefreshToken = "12345", BearerToken = "fredfox" };
(所以没有什么异常)
如果我将属性直接传递到 InlineData(按原样),则会收到一条错误消息,指出该属性不为 null,并且必须是 const、typeof 或数组。如果我将属性设置为静态并引用成员名称,我会收到不同的错误,但仍然不被接受。
我的完整测试用例如下所示
[Theory]
[InlineData(tokenStore.BearerToken, tokenStore.RefreshToken)]
public async Task Test_GetProductApiURL(TokenStore store)
{
var service = await _fixture.GetProductApiURLAsync();
Assert.NotNull(service);
Assert.NotNull(service.ReasonPhrase);
Assert.Equal((int)service.StatusCode, 200);
}
有没有办法传入完整的属性?
您不能直接使用
InlineData
属性传入对象。为了传递对象,我建议选择 MemberData
属性。像这样的东西:
public static IEnumerable<object[]> TokenStoreTestData()
{
yield return new object[] { new TokenStore() };
yield return new object[] { new TokenStore { RefreshToken = "12345", BearerToken = "fredfox" } };
}
[Theory]
[MemberData(nameof(TokenStoreTestData))]
public async Task Test1(TokenStore store)
{
// access store.BearerToken or store.RefreshToken in here and use in your test
}
阅读更多内容这个其他线程
如果
InlineData
是您唯一的选择,您可以使用的解决方法是在测试中构造对象,如下所示:
[Theory]
[InlineData(null, null)]
[InlineData("12345", "fredfox")]
public async Task Test2(string? refreshToken, string? bearerToken)
{
TokenStore store;
if (refreshToken is null || bearerToken is null)
{
store = new TokenStore();
}
else
{
store = new TokenStore
{
RefreshToken = refreshToken,
BearerToken = bearerToken
};
}
// access store.BearerToken or store.RefreshToken here and use in your test
}