如何使用SQL连接模拟Dapper



我正在尝试为存储库编写单元测试用例。我正在努力模仿dapper使用SQL连接。

我的方法:

public IEnumerable<TestModal> TestMethod(int id)
{
var spName = "sp_Test";
var spParams = new
{
ID= id
};
using (var connection = new SqlConnection(_configuration.GetConnectionString("TestDB")))
{
connection.Open();
return connection.Query<TestModal>(spName, spParams, commandType: CommandType.StoredProcedure);
}
}

我正在尝试为上面的方法编写单元测试用例。

[TestFixture]
public class TestClassTests
{
private Mock<IConfiguration> _mockConfiguration;
private Mock<SqlConnection> _mockSqlCOnnection;
private ITestRepository _testRepository;

[SetUp]
public void Setup()
{
_mockConfiguration = new Mock<IConfiguration>();
_mockSqlCOnnection = new Mock<SqlConnection>();            
_testRepository= new TestRepository(_mockConfiguration.Object);
}

[Test]
public void TestMethodTest()
{           
_mockSqlCOnnection.SetupDapper(x => x.Query<TestModal>(It.IsAny<string>(), null, null, true, null, null)).Returns(fakeData);
var result = _testRepository.TestMethod(10);
Assert.IsNotNull(result);
Assert.AreEqual(result.Count(), fakeData.Count());
}
}

你不应该模拟你的数据库进行单元测试。

数据库是非常复杂的东西,这意味着如果您不使用实际的数据库,无论您如何模拟它,您的测试将提供很少甚至没有价值。

根据您的存储库逻辑的复杂程度,您可能需要使用轻量级的数据库提供程序,如SQLite, LocalDb等,或者使用实际的数据库,如本地SQLServer。

显然,如果您使用与生产环境相同的数据库,您将获得最准确的结果。

关于单元测试如何在SQLite中工作的例子,你可以看看微软关于SQLite和InMemory数据库的单元测试的文章。本文使用了EF Core,但是您应该能够推断出在Dapper中使用相同的方法。

有关使用真实数据库进行单元测试的更多信息,您可以阅读Jimmy Bogard关于使用Respawn进行单元测试的文章。

最新更新