automappernsubstituteautomapper-6

How do I unittest when having an automapper map to existing object and using nsubstitute


I am using Automapper 6.2.1 and by that removed all statics and instead I am injecting IMapper.

I am using NSubstitute for mocking.

I have a bit of code where I map two existing objects.

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);

My mapping will replace Value2 in person1.

I am thereafter using person1 with the modified value.

Is it possible to "return" a different person1 from my mock? And how can I do that, if possible?

EDIT

Yes, my question is how I can mock my _mapper correctly and "return" a different person1 (by ref) using NSubstitute.

person1 is a reference object meaning that in the real implementation Value2 from person2 will replace Value2 in person1. But in my unit test I failed to simulate this scenario.


Solution

  • You can modify Person1 argument inside Do method if you don't use result parameter of Map (it will be null)

    _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);
    

    Or you can return new Person1 object from Map, but in this case original person1 was not modified

    _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);