C# 当参数是长字符串时使用xUnit inlineData

C# 当参数是长字符串时使用xUnit inlineData,c#,json,testing,serialization,xunit,C#,Json,Testing,Serialization,Xunit,我试图将4个几乎相同的测试用例转换成一个,其中一个使用xUnits InlineData 我想区别的是参数是一个长字符串——实际上是一个JSON——“字符串”,有一些小的变化。事情是这样的(我只拿了相关的): 第三种是这样的: .... .... "{'content':[" + "{'Id':'00001', 'eNumber':'no', 'isOwner': false, 'isAlone':false}," +

我试图将4个几乎相同的测试用例转换成一个,其中一个使用xUnits InlineData

我想区别的是参数是一个长字符串——实际上是一个JSON——“字符串”,有一些小的变化。事情是这样的(我只拿了相关的):

第三种是这样的:

....
....
                   "{'content':[" +
                    "{'Id':'00001', 'eNumber':'no', 'isOwner': false, 'isAlone':false}," +
                    "{'Id':'00001', 'eNumber':'002', 'isOwner': false, 'isAlone':true}," +
                    "{'Id':'00001', 'eNumber':'no', 'isOwner': false, 'isAlone':false}," +
                    "{'Id':'00001', 'eNumber':'no', 'isOwner': false, 'isAlone':false}," +
                    "]}"
....
....
....
....
                   "{'content':[" +
                    "{'Id':'00001', 'eNumber':'no', 'isOwner': false, 'isAlone':false}," +
                    "{'Id':'00001', 'eNumber':'no', 'isOwner': false, 'isAlone':true}," +
                    "{'Id':'00001', 'eNumber':'007', 'isOwner': true, 'isAlone':true}," +
                    "{'Id':'00001', 'eNumber':'003', 'isOwner': false, 'isAlone':false}," +
                    "]}"
....
....
....
....

        var httpResponseMessage = await User(// something);


        if (!httpResponseMessage .IsSuccessStatusCode) return;

        var content = await httpResponseMessage.Content.ReadAsStringAsync();
        var deserializedContent = JsonConvert.DeserializeObject<UserModel>(content); // it fails here...

....
....
public class UserModel
{
    public UserModelDto[] {get; set;}
}
    public class UserModelDto
{
    public string Id{ get; set; }
    public string ENumber { get; set; }
    public bool IsOwner { get; set; }
    public bool IsAlone { get; set; }
}
接下来的两个。 因此,我想知道是否有一种聪明的方法可以将5种类型的内容作为参数放入InlineData中,从而节省大量复制的代码?可能有,但我还没有弄明白怎么做,没有写很多代码

将测试编写为5个单独的测试都是绿色的,因此我唯一要寻找的是一种更智能的编写代码的方法,通过只更改StringContent中的参数/字符串,使代码更清晰、更易于阅读

根据评论中的问题更新:

我正在测试的类是这样的:

....
....
                   "{'content':[" +
                    "{'Id':'00001', 'eNumber':'no', 'isOwner': false, 'isAlone':false}," +
                    "{'Id':'00001', 'eNumber':'002', 'isOwner': false, 'isAlone':true}," +
                    "{'Id':'00001', 'eNumber':'no', 'isOwner': false, 'isAlone':false}," +
                    "{'Id':'00001', 'eNumber':'no', 'isOwner': false, 'isAlone':false}," +
                    "]}"
....
....
....
....
                   "{'content':[" +
                    "{'Id':'00001', 'eNumber':'no', 'isOwner': false, 'isAlone':false}," +
                    "{'Id':'00001', 'eNumber':'no', 'isOwner': false, 'isAlone':true}," +
                    "{'Id':'00001', 'eNumber':'007', 'isOwner': true, 'isAlone':true}," +
                    "{'Id':'00001', 'eNumber':'003', 'isOwner': false, 'isAlone':false}," +
                    "]}"
....
....
....
....

        var httpResponseMessage = await User(// something);


        if (!httpResponseMessage .IsSuccessStatusCode) return;

        var content = await httpResponseMessage.Content.ReadAsStringAsync();
        var deserializedContent = JsonConvert.DeserializeObject<UserModel>(content); // it fails here...

....
....
public class UserModel
{
    public UserModelDto[] {get; set;}
}
    public class UserModelDto
{
    public string Id{ get; set; }
    public string ENumber { get; set; }
    public bool IsOwner { get; set; }
    public bool IsAlone { get; set; }
}
我的UserModelDto类如下所示:

....
....
                   "{'content':[" +
                    "{'Id':'00001', 'eNumber':'no', 'isOwner': false, 'isAlone':false}," +
                    "{'Id':'00001', 'eNumber':'002', 'isOwner': false, 'isAlone':true}," +
                    "{'Id':'00001', 'eNumber':'no', 'isOwner': false, 'isAlone':false}," +
                    "{'Id':'00001', 'eNumber':'no', 'isOwner': false, 'isAlone':false}," +
                    "]}"
....
....
....
....
                   "{'content':[" +
                    "{'Id':'00001', 'eNumber':'no', 'isOwner': false, 'isAlone':false}," +
                    "{'Id':'00001', 'eNumber':'no', 'isOwner': false, 'isAlone':true}," +
                    "{'Id':'00001', 'eNumber':'007', 'isOwner': true, 'isAlone':true}," +
                    "{'Id':'00001', 'eNumber':'003', 'isOwner': false, 'isAlone':false}," +
                    "]}"
....
....
....
....

        var httpResponseMessage = await User(// something);


        if (!httpResponseMessage .IsSuccessStatusCode) return;

        var content = await httpResponseMessage.Content.ReadAsStringAsync();
        var deserializedContent = JsonConvert.DeserializeObject<UserModel>(content); // it fails here...

....
....
public class UserModel
{
    public UserModelDto[] {get; set;}
}
    public class UserModelDto
{
    public string Id{ get; set; }
    public string ENumber { get; set; }
    public bool IsOwner { get; set; }
    public bool IsAlone { get; set; }
}

扩展我的评论并提供答案,您可以使用
MemberDataAttribute
ClassDataAttribute
来实现这一点。此示例使用
MemberDataAttribute

首先创建一个类来表示您的模型

公共类用户模型
{
[JsonProperty(“内容”)]
public UserModelDto[]{get;set;}
}
公共类UserModelDto
{
[JsonProperty(“id”)]
公共字符串Id{get;set;}
[JsonProperty(“eNumber”)]
公共字符串枚举器{get;set;}
[JsonProperty(“isOwner”)]
公共bool IsOwner{get;set;}
[JsonProperty(“isAlone”)]
公共bool IsAlone{get;set;}
}
公共静态IEnumerable
属性或方法添加到测试类,该类也包含测试场景

公共静态IEnumerable TestCase场景
=>新对象[][]
{
新对象[]
{
新用户模型
{
内容=新[]
{
新UserModelDto
{
Id=“00001”,
ENumber=“否”,
IsOwner=false,
IsAlone=false
},
新UserModelDto
{
Id=“00001”,
ENumber=“007”,
IsOwner=true,
IsAlone=true
},
}
}
},
新对象[]{}//etc
}
MemberDataAttribute
应用于测试

[Theory]//接受参数的测试需要TheoryAttribute,而不是FactAttribute
[成员数据(名称(TestCaseScenarios))]
具有条件的公共异步任务执行操作返回预期结果(UserModel UserModel)
{
//序列化UserModel以创建字符串
var userModelAsString=JsonConvert.SerializeObject(userModel);
//创建StringContent对象
var stringContent=新的stringContent(userModelAsString);
//创建一个HttpClient,其BaseAddress是主机地址
var mockHttp=newmock(MockBehavior.Strict);
模拟HTTP
.Protected()
.设置(
“SendAsync”,
ItExpr.IsAny(),
ItExpr.IsAny())
.ReturnsAsync(新的HttpResponseMessage()
{
StatusCode=HttpStatusCode.OK,
内容=新的StringContent(StringContent)
})
.可验证();
var httpClient=newhttpclient(mockHttp.Object){BaseAddress=newURI(“http://something.com") };
}

您可以创建一个模型来保存数据,并使用来使用
IEnumerable
作为测试源,其中该测试源的元素是对象模型的数组。在测试中,您可以将这些对象序列化为字符串。是的,好的-我希望能够将JSON(或字符串)作为字符串放置,而不是在Id、eNumber、IsOwner和IsAlone中对每个测试进行拆分,但是在执行此操作时,使用“…new StringContent(JsonConvert.SerializedObject(testData))”转换失败,这是什么意思“执行此操作时,转换失败”?错误消息是什么?“错误转换值”{'content':[{'id':'00001',eNumber':'no','isOwner':false,'isAlone':true},{'id':'00001','eNumber':'001','isOwner':false,{'id':'00001','eNumber':'no','isOwner':false,'isAlone':false},{'id':'00001','eNumber':'no','isOwner':false,'isAlone':false},]}输入'userModelDto'"我已经更新了关于类的更多信息-希望我有意义。@ BADABOMsKEY更新的代码无效,你在 USEMODES/<代码>中丢失了一个属性名称,我已经更新了我的答案来改变模型类的设计来匹配你的。ArgHH-我发现了我做错了什么。反序列化和序列化PARt是导致失败的原因。从你的答案中获得了很大的灵感,但是我使用了一个包含整个“内容”的字符串,而不是一个单独的字符串,我保存了许多代码行。非常棒,感谢你的快速回答。我会在睡了一觉后用解决方案更新我的问题-这个问题困扰了几个小时。