moq objects Returns method, should return a null object

85,886

Solution 1

You don't indicate what the error was, but this should work:

unitOfWork.Setup(m => m.PhysicalTests).Returns((IRepository<PhysicalTest>)null);

I suspect you tried to call it with Returns(null), which causes the compiler to complain since Returns is overloaded and it doesn't know which method should be called. Casting to a specific type removes the ambiguity.

Solution 2

rt is a return type of method: FindById

repository.Setup(r => r.FindById(It.IsAny<int>())).Returns(Task.FromResult((rt)null));

Solution 3

If you are receiving an error like this:

enter image description here

You just need to specify the input parameter of 'Returns' method. Take a look in my example:

_ = _fileStorage.Setup(x => x.LoadDocument(It.IsAny<string>())).Returns(value: null);

Solution 4

Organization is a return type of method: Get

mockCache
    .Setup(cache => cache.Get(It.IsAny<string>(), It.IsAny<string>(),It.IsAny<string>()))
    .Returns(value: null as Organization);
Share:
85,886

Related videos on Youtube

Daniel
Author by

Daniel

Updated on April 09, 2022

Comments

  • Daniel
    Daniel about 2 years

    I'm developing a Web API, and one of the test I came up with is that, if client makes a GET operation with a Physical Test ID (Physical Test is the resource I'm looking for) and that physical test is not found, the web API should return a 404 status.

    Now, I'm using moq framework for my tests and I have the following code:

    [TestMethod]
    public void then_if_physical_test_not_found_return_not_found_status()
    {
        var unitOfWork = new Mock<IUnitOfWork>();
        var repository = new Mock<IRepository<PhysicalTest>>();
        repository.Setup(r => r.FindById(It.IsAny<int>())).Returns();
        unitOfWork.Setup(m => m.PhysicalTests).Returns(repository.Object);
        var pt = new PhysicalTestResource(unitOfWork.Object);
        HttpResponseMessage<PhysicalTest> response = pt.GetPhysicalTest(43);
        Assert.AreEqual(HttpStatusCode.NotFound, response.StatusCode)
    }
    

    I need the Returns() method to return a null object, which is going to be what the actual API method would return if the resource is not found.

    I tried sending null as a parameter in the Returns() method but had no success.

  • Daniel
    Daniel over 12 years
    it worked, but I had to make this modification: unitOfWork.Setup(m => m.PhysicalTests).Returns((PhysicalTest)null);
  • Jeff Ogata
    Jeff Ogata over 12 years
    ah, ok... I assumed that since you were trying to return repository.Object that was the type returned by PhysicalTests.
  • Dan Csharpster
    Dan Csharpster over 7 years
    I tried the same thing and I'm getting a System.NotSupportedException. {"Invalid setup on a non-virtual (overridable in VB) member: x => x.GetFoo(.value.Id)"} Any ideas?
  • bcr
    bcr about 7 years
    @DanCsharpster You can only use Moq on interfaces or abstract classes with virtual members. Whatever class you're using that is the type of x is either a concrete class or an abstract class that has GetFoo() as non-virtual/overridable.
  • Jeppe Stig Nielsen
    Jeppe Stig Nielsen over 5 years
    I can recommend this way of resolving the overload ambiguity. I just want to mention that, since the two non-generic overloads of Returns which are important here, have different names for their parameter, you can also resolve the ambiguity by writing: ... .Returns(value: null) (here value is just the name of the parameter in the overload we want, it is not a keyword).