C# MSTest中以多个复杂对象作为参数的单元测试方法
我目前正在从事一个项目,该项目的方法包括参数、复杂对象(主要是存储库对象)。必须使用MSTest进行测试。让对象在TestInitialize方法中创建,以便它们可以用作测试方法中的参数,并作为参数传递给测试方法中的实际方法,这是一种明智的方法吗?请提出更好的选择 我在下面附上需要进行单元测试的方法(Exectue()方法)的示例代码C# MSTest中以多个复杂对象作为参数的单元测试方法,c#,unit-testing,mstest,C#,Unit Testing,Mstest,我目前正在从事一个项目,该项目的方法包括参数、复杂对象(主要是存储库对象)。必须使用MSTest进行测试。让对象在TestInitialize方法中创建,以便它们可以用作测试方法中的参数,并作为参数传递给测试方法中的实际方法,这是一种明智的方法吗?请提出更好的选择 我在下面附上需要进行单元测试的方法(Exectue()方法)的示例代码 public class AddOrdersToDbCommand { private IOrdersRepository _ordersReposit
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,很抱歉出错。代码现在已更正。谢谢。还有一个疑问:为了创建一个“排列值”来测试“实际值”,以便做出断言,我可以使用一个模拟对象。但是对于调用原始方法,我不应该使用存根对象吗?取决于您所说的“原始方法”是什么意思。如果您指的是一个非存根的方法调用,该方法调用指向真实数据库并查找真实值,那么您是在进行集成测试,而不是单元测试。这两种都需要。我已经在这里解释了两者在哲学上的区别