我正在尝试开始使用Moq并且无法找到任何好的资源来完成我需要的工作。
我有一个数据接口类,它有一个Get方法,它通过存储过程返回一个数据集。这是代码编写的方式,我现在无法改变它,因此必须以这种方式完成。
我想通过模拟数据集并返回数据来测试这个类,所以我不必实际进行数据库调用。
是否有人这样做,如果是这样,哪里是开始这样做的好地方?
答案 0 :(得分:7)
您不需要数据库连接来填充DataSet。你可以像这样嘲笑:
IDataInterface di = new Mock<IDataInterface>();
DataSet mockDataSet = CreateMockDataSet();
di.Expect(x => x.Get()).Returns(mockDataSet);
something.UseDataInterface(di.Object);
但是,填充模拟DataSet非常痛苦。如果我这样做,我通常会在返回的DataSet前放置一个facade接口,这样更容易模拟。或者我更改代码以使用DataTable,这更容易填写。
或者,使用嵌入式数据库(如SQLite或SQL Server CE)进行单元测试。
答案 1 :(得分:0)
我也遇到了上述问题并提出了这个解决方案。我正在分享它,因为我无法在谷歌上找到任何东西:
[TestCategory("GetDataSet")]
[TestMethod]
public void GetDataSet_ValidCall_ShouldPass()
{
// Arrange
var dataSet = Builder<DataSet>.CreateNew().Build();
DataTable table1 = new DataTable();
table1.Columns.Add("Id", typeof(int));
table1.Columns.Add("Name", typeof(string));
table1.Rows.Add("1", "Name1");
DataTable table2 = new DataTable();
table2.Columns.Add("More", typeof(bool));
table2.Rows.Add(false);
dataSet.Tables.Add(table1);
dataSet.Tables.Add(table2);
objectWhichHaveProcMethod.Setup(elem => elem.ExecuteProcAndGetDataSet("YourSprocName", It.IsAny<SqlParameter>(), It.IsAny<SqlParameter>())).Returns(dataSet);
// Act
var response = dataInterfaceClass.Get();
// Assert
Assert.AreNotEqual(response, null);
}