我的应用程序是使用CQRS模式和存储库设计的,如何在不连接数据库的情况下为命令类创建单元测试?
我们正在使用Moq来创建我们的存储库的模拟。
答案 0 :(得分:2)
您必须模拟数据库层。同样,您也可以使用Mock Repositor层而不是数据库层。
[TestClass]
public class TestCommandServiceTests
{
private readonly TestService _testService;
private readonly ITestRepositor _testRepository;
private readonly Mock<IDatabaseLaye> _mock;
[SetUp]
public void Setup()
{
_mock = new Mock<IDatabaseLayer>();
_testRepository = new TestRepository(_mock);
_testService = new TestService(_testRepository);
}
[Test]
public void TestMethod_ValidRequest_ShouldTestSuccessfully()
{
// Arrange
var request = new TestMethodRequest();
this._mock.Setup(c => c.TestSPMethod(null)).Returns(1000);
// Act
var response = _testService.TestMethod(request);
// Assert
Assert.IsNotNull(response);
Assert.AreEqual(1000, response.Id);
}
}
答案 1 :(得分:1)
当然你可以模拟数据库(你甚至应该,教科书说)。但是这很快变得非常麻烦,特别是当复杂的数据库约束发挥作用时。
在实践中,拥有本地测试数据库(例如,如果可能的话,使用SQLite或MS SQL CE在内存中)并对整个“持久性堆栈”进行测试(在您的情况下:命令,存储库和数据库)可能更有效率) 一气呵成。这是The Art of Unit Testing一书中推荐的方法,我发现它在实践中非常有用。