使用不同数据类型的相同参数调用测试方法两次

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

我试图通过结合两种测试验证方法来减少重复代码。两种测试方法都传递三个参数(

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?

c# json .net specflow
1个回答
0
投票

一种典型的方法是使用泛型,这使您可以定义一个可以采用任何类型或某些类型子集作为参数的方法:

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
这样的断言方法。只有前者关心物品的订购。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.