我试图通过结合两种测试验证方法来减少重复代码。两种测试方法都传递三个参数(
actualResponse
、expectedReponse
、filterParams
),但问题是,即使这两种方法为参数定义了相同的名称,它们的数据类型也是不同的。
以下是脚本摘要:
TestSteps.cs 类,其中调用这些方法:
public class TestSteps : BaseTest
{
// _result holds the actual results coming from context get cal
private Context _result = new();
// _SolutionExpectedResponse have expected response from json file.
private readonly Context _SolutionExpectedResponse = new();
public TestSteps()
{
string jsonstring = File.ReadAllText(@Path of response.json file);
_SolutionExpectedResponse = JsonConvert.DeserializeObject<Context>(jsonstring);
}
[When(@Call context api)]
public void WhenCallContextAPI()
{
_result = Context.GetAsync(token,resource).Result;
}
[Then(@Verify the response Values)]
public void ThenVerifyTheResponseValues()
{
ValidateDataValues(_result.Data, _SolutionExpectedResponse.Data, new string[] {"data"})
ValidateSensitiveDataValues(_result.SensitiveData, _SolutionExpectedResponse.SensitiveData, new string[] {"sensitiveData"})
}
}
编写验证方法的BaseTest.cs类:
方法#1:
Protected void ValidateDataValues(List<DataReadable> actualResponse, List <DataReadable> expectedResponse, string[] filterParams)
{
if (filterParams.contains("data"))
{
if(actualResponse !=null)
{
for(int i=0; i < expectedResponse.Count; i++)
{
if((actualResponse[i].Key !=null)
{
actualResponse[i].Key.Value.ToString().Should.BeEquivalentTo(expectedResponse[i].Key.Value.ToString());
}
}
return;
}
else
{
actualResponse.Should().BeNull();
}
}
}
方法#2:
Protected void ValidateSensitiveDataValues(List<SensitiveDataReadable> actualResponse, List <SensitiveDataReadable> expectedResponse, string[] filterParams)
{
if (filterParams.contains("sensitiveData"))
{
if(actualResponse !=null)
{
for(int i=0; i < expectedResponse.Count; i++)
{
if((actualResponse[i].Key !=null)
{
actualResponse[i].Key.Value.ToString().Should.BeEquivalentTo(expectedResponse[i].Key.Value.ToString());
}
}
return;
}
else
{
actualResponse.Should().BeNull();
}
}
}
我是否可以通过在method#1中添加method#2参数并消除method#2来减少重复代码?
或
通过转换数据类型从方法 #2 调用方法 #1?
一种典型的方法是使用泛型,这使您可以定义一个可以采用任何类型或某些类型子集作为参数的方法:
public bool ValidateSensitiveDataValues<T>(IEnumerable<T> actual, IEnumerable<T> expected, IEqualityComparer<T> comparer){
return actual.SequenceEqual(expected, comparer);
}
请注意,如果 T 是一个类,您需要为该方法提供一个 EqualityComparer 对象,或者限制该方法仅在
T
实现 IEquatable: ValidateSensitiveDataValues<T>(IEnumerable<T> actual, IEnumerable<T> expected) where T : IEquatable<T>
时才有效。我倾向于前者,因为它更灵活。如果您不这样做,任何引用对象都将使用引用相等性,这可能不是您想要的。
您可能还想使用单元测试库。 NUnit 是一种流行的方法,具有像
CollectionAssert.AreEqual
和 CollectionAssert.AreEquivalent
这样的断言方法。只有前者关心物品的订购。