When unit testing, how do I mock a return null from async method?
20,951
Solution 1
You get a compiler error because you return a task that doesn't match the type the async method returns. You should return Task<Member>
instead of simply Task<object>
:
repository.Setup(r => r.GetMemberAsync(email)).Returns(Task.FromResult<Member>(null));
Solution 2
It is also possible to return the result without using the Task class.
repository
.Setup(r => r.GetMemberAsync(email))
.ReturnsAsync((Member)null);
Solution 3
Old question but you can also do this which I think it cleaner:
Assuming the default value of your object is null you can also use:
default(<insert object type here>)
e.g.
default(Member)
default(List<string>)
etc.
Full Example:
var myRepo = new Mock<IMyRepo>();
myRepo
.Setup(p => p.GetAsync("name"))
.ReturnsAsync(default(List<string>));
Author by
ScubaSteve
Updated on January 16, 2020Comments
-
ScubaSteve over 4 years
Normally, I mock my repo like so:
var repository = new Mock<ISRepository>(); repository.Setup(r => r.GetMemberAsync(email)) .Returns(Task.FromResult(new Member { FirstName = firstName, LastName = lastName }));
But, in my code, I check to see if the member is not found, i.e. GetMemberAsync returns null. How do I mock this?
I tried:
var repository = new Mock<ISRepository>(); repository.Setup(r => r.GetMemberAsync(email)) .Returns(Task.FromResult<object>(null));
but I get a compile error.