Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.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# MSTest中以多个复杂对象作为参数的单元测试方法_C#_Unit Testing_Mstest - Fatal编程技术网

C# MSTest中以多个复杂对象作为参数的单元测试方法

C# MSTest中以多个复杂对象作为参数的单元测试方法,c#,unit-testing,mstest,C#,Unit Testing,Mstest,我目前正在从事一个项目,该项目的方法包括参数、复杂对象(主要是存储库对象)。必须使用MSTest进行测试。让对象在TestInitialize方法中创建,以便它们可以用作测试方法中的参数,并作为参数传递给测试方法中的实际方法,这是一种明智的方法吗?请提出更好的选择 我在下面附上需要进行单元测试的方法(Exectue()方法)的示例代码 public class AddOrdersToDbCommand { private IOrdersRepository _ordersReposit

我目前正在从事一个项目,该项目的方法包括参数、复杂对象(主要是存储库对象)。必须使用MSTest进行测试。让对象在TestInitialize方法中创建,以便它们可以用作测试方法中的参数,并作为参数传递给测试方法中的实际方法,这是一种明智的方法吗?请提出更好的选择

我在下面附上需要进行单元测试的方法(Exectue()方法)的示例代码

public class AddOrdersToDbCommand
{
     private IOrdersRepository _ordersRepository;
     private OrderSetting _ordersSetting;

     public AddOrdersToDbCommand(IOrdersRepository ordersRepository, OrderSetting ordersSetting)
     {
        _ordersRepository = ordersRepository;
        _ordersSetting = ordersSetting;
     }

     public void Execute()
     {
         OrderSetting modifyOrderSettings = _ordersRepository.Get(_ordersSetting.Id);
         modifyOrderSettings.Name = _ordersSetting.Name;
         modifyOrderSettings.Status = _ordersSetting.Status;
         modifyOrderSettings.UpdatedBy = _ordersSetting.UpdatedBy;
         modifyOrderSettings.UpdatedDate = _ordersSetting.UpdatedDate;
         _ordersRepository.SaveOrUpdate(modifyOrderSettings);
         _ordersRepository.DbContext.CommitChanges();
     }

}
您应该使用(使用Moq之类的模拟框架)来提供任何依赖对象。这样,您将只隔离和测试当前正在测试的内容

如果您真的必须创建存根对象,我更喜欢使用helper类。我有TestDataGenerator.cs类。在那里,您可以有一组生成对象的静态方法

示例用法将变成
TestDataGenerator.GetStubOrderSetting()使用util类的优点是,您可以创建一堆返回存根对象的助手方法,而不会使TestInitialize方法变得庞大和缓慢。此外,还可以组合各个存根方法以返回更复杂的对象


例如
TestDataGenerator.GetStubEmployeeWithOrder()
将首先创建一个存根雇员,然后调用
TestDataGenerator.GetStubOrderSetting(),用于在返回新创建的存根员工之前为其设置订单。

我在测试中使用了一个类,该类设置了模拟(Moq)存储库以及用于配置的设置方法

class MockRepo {
    private Mock<IRepository> descriptiveSettingRepository;
    private ArrayList _repository = new ArrayList();

    public MockRepo() {
        mockRepo.Setup( /* setup properties */ );
    }
}
class-MockRepo{
私有模拟描述符设置存储库;
private ArrayList_repository=new ArrayList();
公共回购协议(){
mockRepo.Setup(/*Setup properties*/);
}
}
使用MoQ回调将对象添加到ArrayList。
您还可以查询ArrayList和return对象。

能否提供一个您可能喜欢编写的测试示例?您在测试中会断言什么?另外,
\u descriptiveSettingRepository
\u descriptiveSetting
分配在哪里?@davintroon,很抱歉出错。代码现在已更正。谢谢。还有一个疑问:为了创建一个“排列值”来测试“实际值”,以便做出断言,我可以使用一个模拟对象。但是对于调用原始方法,我不应该使用存根对象吗?取决于您所说的“原始方法”是什么意思。如果您指的是一个非存根的方法调用,该方法调用指向真实数据库并查找真实值,那么您是在进行集成测试,而不是单元测试。这两种都需要。我已经在这里解释了两者在哲学上的区别