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

时间:2013-03-20 23:01:30

标签: c# unit-testing 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();
     }

}

2 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分:0)

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

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

    public MockRepo() {
        mockRepo.Setup( /* setup properties */ );
    }
}

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