当自动映射器映射到现有对象并使用 nsubstitute 时如何进行单元测试
How do I unittest when having an automapper map to existing object and using nsubstitute
我正在使用 Automapper 6.2.1 并删除了所有静态信息,而是注入了 IMapper
。
我正在使用 NSubstitute 进行模拟。
我有一些代码可以映射两个现有对象。
public class Person1 {
public string Value1 { get; set; }
public string Value2 { get; set; }
}
public class Person2 {
public string Value2 { get; set; }
}
...
_mapper.Map(person2, person1);
我的映射将替换 person1
中的 Value2
。
此后我使用 person1
修改后的值。
是否可以 "return" 与我的模拟对象不同的人1?如果可能的话,我该怎么做?
编辑
是的,我的问题是如何使用 NSubstitute 正确地模拟我的 _mapper
和 "return" 不同的人1(by ref)。
person1 是一个引用对象,这意味着在实际实现中,来自 person2 的 Value2 将替换 person1 中的 Value2。但是在我的单元测试中我没有模拟这个场景。
如果不使用 Map 的结果参数(它将为 null),您可以在 Do 方法中修改 Person1 参数
_mapper
.When(x => x.Map(person2, person1))
.Do(x =>
{
var person1Arg = x.Arg<Person1>();
person1Arg.Value1 = "value-1";
person1Arg.Value2 = "value-2";
});
//map and use person1
_mapper.Map(person2, person1);
或者您可以 return 从 Map 新建 Person1 对象,但在这种情况下原始 person1 没有被修改
_mapper.Map(person2, person1)
.Returns(new Person1
{
Value1 = "value-1",
Value2 = "value-2"
});
//then map and use resultPerson1 instead of person1
var resultPerson1 = _mapper.Map(person2, person1);
我正在使用 Automapper 6.2.1 并删除了所有静态信息,而是注入了 IMapper
。
我正在使用 NSubstitute 进行模拟。
我有一些代码可以映射两个现有对象。
public class Person1 {
public string Value1 { get; set; }
public string Value2 { get; set; }
}
public class Person2 {
public string Value2 { get; set; }
}
...
_mapper.Map(person2, person1);
我的映射将替换 person1
中的 Value2
。
此后我使用 person1
修改后的值。
是否可以 "return" 与我的模拟对象不同的人1?如果可能的话,我该怎么做?
编辑
是的,我的问题是如何使用 NSubstitute 正确地模拟我的 _mapper
和 "return" 不同的人1(by ref)。
person1 是一个引用对象,这意味着在实际实现中,来自 person2 的 Value2 将替换 person1 中的 Value2。但是在我的单元测试中我没有模拟这个场景。
如果不使用 Map 的结果参数(它将为 null),您可以在 Do 方法中修改 Person1 参数
_mapper
.When(x => x.Map(person2, person1))
.Do(x =>
{
var person1Arg = x.Arg<Person1>();
person1Arg.Value1 = "value-1";
person1Arg.Value2 = "value-2";
});
//map and use person1
_mapper.Map(person2, person1);
或者您可以 return 从 Map 新建 Person1 对象,但在这种情况下原始 person1 没有被修改
_mapper.Map(person2, person1)
.Returns(new Person1
{
Value1 = "value-1",
Value2 = "value-2"
});
//then map and use resultPerson1 instead of person1
var resultPerson1 = _mapper.Map(person2, person1);