检查Moq'It.Is <string>()'参数匹配项中包含的更好方法

时间:2019-09-17 21:47:22

标签: c# unit-testing moq

我正在嘲笑一个正在调用数据库的方法。该方法具有一个参数,即要执行的SQL查询。

public interface IDataAccess
{
    List<string> GetDataToList(string query);
}

public class DataAccess : IDataAccess
{
    public List<string> GetDataToList(string query)
    {
        // Db call
    }
}

该模拟方法被调用2次或3次,并以不同的查询作为参数。由于某些逻辑,没有执行查询的特定顺序。

单元测试代码:

[TestMethod]
public void UnitTestCase
{
   Mock<IDataAccess> mock = Mock<IDataAccess>();

   List<string> data1 = new List<string>();
   mock.Setup(x =>  
   x.GetDataToList(It.Is<string(
   s => s.Contains("select * from table")))).Returns(data1);


   List<string> data2 = new List<string>();
   mock.Setup(x =>  
   x.GetDataToList(It.Is<string(
   s => s.Contains("select * from table1")))).Returns(data2);
}

现在,按照单元测试代码的模拟方法将被调用2次,并且由于没有顺序并且两个SQL查询都具有相同的部分,因此Contains方法中的SetUp会进行第一个调用只要。由于这两个呼叫,data1列表将被返回。

如何避免这个问题?

1 个答案:

答案 0 :(得分:0)

如果使用代码,可能会很麻烦,因为

select * from table1

已经包含

select * from table

编辑

好吧,基本上,您可以在此语句中添加select * from table t或仅在Contains方法中添加空间

[TestMethod]
public void UnitTestCase
{
    Mock<IDataAccess> mock = 
    Mock<IDataAccess>();

    List<string> data1 = new List<string>();
    mock.Setup(x =>  
    x.GetDataToList(It.Is<string(
    s => s.Contains("select * from table ")))).Returns(data1); <======= (here)


    List<string> data2 = new List<string>();
    mock.Setup(x =>  
    x.GetDataToList(It.Is<string(
    s => s.Contains("select * from table1")))).Returns(data2);
}