我正在嘲笑一个正在调用数据库的方法。该方法具有一个参数,即要执行的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
列表将被返回。
如何避免这个问题?
答案 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);
}