You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Xunit Theory中传入完整属性作为测试数据?

解决Xunit中传入完整实例属性作为测试数据的问题

问题根源

[InlineData]要求传入的参数必须是编译时常量(比如字符串字面量、数字、typeof表达式等),直接引用类的实例属性必然报错。[MemberData]是传递非常量实例数据的合适方案,但需要按规则配置静态成员。

正确实现步骤

  1. 将测试用实例改为静态属性
    MemberData引用的成员必须是静态的,先调整你的实例定义:
private static TokenStore _nullTokenStore = new TokenStore();
private static TokenStore _tokenStore = new TokenStore { RefreshToken = "12345", BearerToken = "fredfox" };
  1. 定义静态数据源方法
    创建静态方法返回包含目标实例的枚举集合:
public static IEnumerable<object[]> GetTokenStoreData()
{
    yield return new object[] { _nullTokenStore };
    yield return new object[] { _tokenStore };
}
  1. 修改测试方法绑定数据源
    注意你原测试方法的参数是TokenStore store,但之前[InlineData]传的是两个字符串,存在参数不匹配问题,需修正为对应实例的参数:
[Theory]
[MemberData(nameof(GetTokenStoreData))]
public async Task Test_GetProductApiURL(TokenStore store)
{
    // 若GetProductApiURLAsync需要用到传入的store,记得在这里传递
    // 例如:var service = await _fixture.GetProductApiURLAsync(store);
    var service = await _fixture.GetProductApiURLAsync();

    Assert.NotNull(service);
    Assert.NotNull(service.ReasonPhrase);
    Assert.Equal((int)HttpStatusCode.OK, 200);
}

多参数场景适配

如果需要同时传递BearerToken和RefreshToken两个参数,可调整数据源和测试方法:

public static IEnumerable<object[]> GetTokenDetailsData()
{
    yield return new object[] { _tokenStore.BearerToken, _tokenStore.RefreshToken };
    yield return new object[] { _nullTokenStore.BearerToken, _nullTokenStore.RefreshToken };
}

对应的测试方法:

[Theory]
[MemberData(nameof(GetTokenDetailsData))]
public async Task Test_GetProductApiURL(string bearerToken, string refreshToken)
{
    var service = await _fixture.GetProductApiURLAsync(bearerToken, refreshToken);

    Assert.NotNull(service);
    Assert.NotNull(service.ReasonPhrase);
    Assert.Equal((int)HttpStatusCode.OK, 200);
}

内容的提问来源于stack exchange,提问作者Nodoid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 20:46:09