我目前正在开发一个项目,该项目具有作为参数的复杂对象(主要是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();
}
}
答案 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并返回对象。