将属性作为 Xunit 理论传递

问题描述 投票:0回答:1

我正在尝试创建一个简单的 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);
}

有没有办法传入完整的属性?

c# xunit
1个回答
0
投票

您不能直接使用

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
    }
© www.soinside.com 2019 - 2024. All rights reserved.