我使用 NUnit 进行单元测试。在我当前的项目中,我遇到了一个问题,我想测试的几乎所有功能都连接到数据库。同时,数据库在应用程序启动时是有界的。
我现在很困惑,我读过关于模拟单元测试的内容,但不知道如何处理这个问题。我这里有什么解决方案吗?
更难的是,这个数据库是静态的,而不是我的方法的参数......这让我很困惑
我使用 NUnit 进行单元测试。在我当前的项目中,我遇到了一个问题,我想测试的几乎所有功能都连接到数据库。同时,数据库在应用程序启动时是有界的。
我现在很困惑,我读过关于模拟单元测试的内容,但不知道如何处理这个问题。我这里有什么解决方案吗?
更难的是,这个数据库是静态的,而不是我的方法的参数......这让我很困惑
您可能想要查看应用程序的体系结构。确保数据库层是松散耦合的,例如通过使用接口。这将使为您的数据库层编写存根或模拟成为可能。
The normal solution to this is to keep your data layer in a separate class that implements a well-known interface. For instance:
public interface IDataLayer
{
IEnumerable<Customer> GetAllCustomers();
Order GetOrderById(int id);
}
You will implement the interface as normal for your actual data access
public class SqlServerDataLayer : IDataLayer
{
// implementation
}
But in your tests, you can now use a mocking framework like Moq or RhinoMocks to set up a mock data layer that returns test data. This ensures you are only testing how your classes use the data, which is ideal.
[Test]
public void TestGettingCustomersRefreshesViewModel()
{
//arrange
var mockDb = new Mock<IDataLayer>();
mockDb.Setup(db => db.GetAllCustomers()).Returns(new List<Customer>());
underTest.DataRepository = mockDb.Object;
//act
underTest.GetCustomerCommand.Execute();
//assert
Assert.That(underTest.CustomerList != null);
}