如何在Xunit Theory中传入完整属性作为测试数据?
解决Xunit中传入完整实例属性作为测试数据的问题
问题根源
[InlineData]要求传入的参数必须是编译时常量(比如字符串字面量、数字、typeof表达式等),直接引用类的实例属性必然报错。[MemberData]是传递非常量实例数据的合适方案,但需要按规则配置静态成员。
正确实现步骤
- 将测试用实例改为静态属性
MemberData引用的成员必须是静态的,先调整你的实例定义:
private static TokenStore _nullTokenStore = new TokenStore(); private static TokenStore _tokenStore = new TokenStore { RefreshToken = "12345", BearerToken = "fredfox" };
- 定义静态数据源方法
创建静态方法返回包含目标实例的枚举集合:
public static IEnumerable<object[]> GetTokenStoreData() { yield return new object[] { _nullTokenStore }; yield return new object[] { _tokenStore }; }
- 修改测试方法绑定数据源
注意你原测试方法的参数是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
相关产品推荐
相关产品推荐

