【发布时间】:2021-02-25 03:41:23
【问题描述】:
我正在尝试为存储库编写单元测试用例。我正在努力使用 SQL 连接来模拟 dapper。
我的方法:
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());
}
}
【问题讨论】:
-
旁注:您应该不为您的存储过程使用
sp_前缀。微软有reserved that prefix for its own use (see Naming Stored Procedures),你确实会在未来某个时候冒着名称冲突的风险。 It's also bad for your stored procedure performance。最好只是简单地避免sp_并使用其他东西作为前缀 - 或者根本不使用前缀! -
测试是什么意思?也就是说,您的方法中没有可测试的逻辑,即可单元测试。如果您想获得任何价值,您需要使用实际的数据库连接进行集成测试。
-
模拟具体类是一种代码味道。您可能想要模拟 IDbConnection 而不是 SqlConnection,然后重构您的代码,以便 TestMethod 可以干净地获取实例化的 IDbConnection。
-
我宁愿使用真正的数据库并使用 github.com/jbogard/Respawn 或 github.com/v-zubritsky/Reseed 之类的东西(我正在编写后者)。模拟通常会使您的测试变得脆弱,因此当需要测试替身来隔离某些组件时,最好使用存根。查看一篇关于 mocks 问题的文章medium.com/javascript-scene/…
标签: sql-server unit-testing moq dapper