繁体   English   中英

在MSTest中将多个复杂对象作为参数的单元测试方法

[英]Unit testing methods that have multiple complicated objects as parameters in MSTest

我目前正在开发一个项目,该项目具有作为参数的复杂对象(主要是Repository对象)。 测试必须使用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();
     }

}

您应该使用Mocks (使用像Moq这样的Mocking框架)来提供任何依赖对象。 这样,您只能隔离和测试当前正在测试的内容。

如果你真的必须创建存根对象,我更喜欢使用辅助类。 我有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 */ );
    }
}

使用MoQ Callback将对象添加到ArrayList。 您还可以查询ArrayList并返回对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM