Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 应用程序启动时使用数据库绑定的方法的单元测试_C#_Database_Unit Testing_Nunit - Fatal编程技术网

C# 应用程序启动时使用数据库绑定的方法的单元测试

C# 应用程序启动时使用数据库绑定的方法的单元测试,c#,database,unit-testing,nunit,C#,Database,Unit Testing,Nunit,我使用NUnit进行单元测试。在我当前的项目中,我遇到了一个问题,我想测试的几乎所有函数都连接到数据库。同时,当应用程序启动时,数据库被绑定 我现在很困惑,我读过关于模拟单元测试的文章,但不知道如何处理这个问题。有什么解决办法吗 更困难的是,这个数据库是静态的,不是我方法的参数。。。这让我非常困惑您可能想查看应用程序的体系结构。确保数据库层是松散耦合的,例如通过使用接口。这将使为数据库层编写存根或模拟成为可能。您可能需要查看应用程序的体系结构。确保数据库层是松散耦合的,例如通过使用接口。这将使为

我使用NUnit进行单元测试。在我当前的项目中,我遇到了一个问题,我想测试的几乎所有函数都连接到数据库。同时,当应用程序启动时,数据库被绑定

我现在很困惑,我读过关于模拟单元测试的文章,但不知道如何处理这个问题。有什么解决办法吗


更困难的是,这个数据库是静态的,不是我方法的参数。。。这让我非常困惑

您可能想查看应用程序的体系结构。确保数据库层是松散耦合的,例如通过使用接口。这将使为数据库层编写存根或模拟成为可能。

您可能需要查看应用程序的体系结构。确保数据库层是松散耦合的,例如通过使用接口。这将使为数据库层编写存根或模拟成为可能。

通常的解决方案是将数据层保存在一个单独的类中,该类实现了一个众所周知的接口。例如:

public interface IDataLayer
{
    IEnumerable<Customer> GetAllCustomers();

    Order GetOrderById(int id);
}
但是在您的测试中,您现在可以使用Moq或rhinomock之类的模拟框架来设置一个返回测试数据的模拟数据层。这确保您只测试类如何使用数据,这是理想的

[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);
}
[测试]
public void testGettingCustomerRefreshesViewModel()
{
//安排
var mockDb=new Mock();
Setup(db=>db.GetAllCustomers()).Returns(newlist());
underTest.DataRepository=mockDb.Object;
//表演
underTest.GetCustomerCommand.Execute();
//断言
Assert.That(underTest.CustomerList!=null);
}

通常的解决方案是将数据层保存在一个单独的类中,该类实现了一个众所周知的接口。例如:

public interface IDataLayer
{
    IEnumerable<Customer> GetAllCustomers();

    Order GetOrderById(int id);
}
但是在您的测试中,您现在可以使用Moq或rhinomock之类的模拟框架来设置一个返回测试数据的模拟数据层。这确保您只测试类如何使用数据,这是理想的

[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);
}
[测试]
public void testGettingCustomerRefreshesViewModel()
{
//安排
var mockDb=new Mock();
Setup(db=>db.GetAllCustomers()).Returns(newlist());
underTest.DataRepository=mockDb.Object;
//表演
underTest.GetCustomerCommand.Execute();
//断言
Assert.That(underTest.CustomerList!=null);
}

您需要使用模拟框架模拟数据库访问语句。您可以使用moles框架。请参考:@daryal:具体情况如何?假设我有一个方法X(),该方法访问静态数据库DB,该数据库在我的应用程序启动时初始化。现在我可以做什么来模拟这个DB?moles甚至可以让你模拟框架函数。需要更多的信息和代码来提供正确的答案…@daryal:好的。我在这里使用MVC3,当在Global.asax.cs上启动应用程序时,我的数据库被初始化。我有一个初始化DbContext(访问这个数据库)的方法,DbContext是静态的。现在,如何测试这个方法?您需要使用模拟框架来模拟数据库访问语句。您可以使用moles框架。请参考:@daryal:具体情况如何?假设我有一个方法X(),该方法访问静态数据库DB,该数据库在我的应用程序启动时初始化。现在我可以做什么来模拟这个DB?moles甚至可以让你模拟框架函数。需要更多的信息和代码来提供正确的答案…@daryal:好的。我在这里使用MVC3,当在Global.asax.cs上启动应用程序时,我的数据库被初始化。我有一个初始化DbContext(访问这个数据库)的方法,DbContext是静态的。现在,如何测试这个方法?我已经创建了类来映射数据库,但是我仍然不知道…我已经创建了类来映射数据库,但是我仍然不知道…你在这里使用了什么样的模拟UT?我在这里使用了Moq。我喜欢它——它干净、实用,一旦你通过lambdas,它就非常可读。你在这里使用了什么样的模拟UT?我在这里使用了Moq。我喜欢它——一旦你通过lambdas,它干净、实用、可读性强。