1

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

}
4

2 回答 2

3

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

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

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

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

于 2013-03-20T23:21:55.423 回答
0

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

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

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

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

于 2013-03-20T23:42:25.610 回答