Alex Gordon
Alex Gordon

Reputation: 60711

verifying setup on a passed in mocked object

I am testing my class

public class myclass
{
  private IAwesome awesomeObject;
  public myclass(IAwesome awesomeObject)
  {
     this.awesomeObject = awesomeObject;
  }


  public void MethodUnderTest()
  {
      this.awesomeObject.RunSomething(); //I want to verify that RunSomething was called
  }
}

The way I am doing this is:

//Arrange
var mockAwesome = new Mock<IAwesome>();
mockAwesome.Setup(x=>x.RunSomething()).Returns ... Verify()...;
//Act
var sut = new myclass(mockAwesome.object);
sut.MethodUnderTest();
//Assert
mockAwesome.Verify();

The exception I am getting is:

System.NotSupportedException : Expression references a method that does not belong to the mocked object: x => x.RunSomething

Is it not possible to test that a specific method was executed on a mocked object that I passed into a class, that is now part of a private member of that class?

Upvotes: 1

Views: 94

Answers (2)

Nkosi
Nkosi

Reputation: 247068

Modify set up line to mockAwesome.Setup(x=>x.RunSomething()).Verifiable() and it should work for the example you provided.

[TestClass]
public class MoqVerificationTest {
    [TestMethod]
    public void Moq_Should_Verify_Setup() {
        //Arrange
        var mockAwesome = new Mock<IAwesome>();
        mockAwesome.Setup(x => x.RunSomething()).Verifiable();
        //Act
        var sut = new myclass(mockAwesome.Object);
        sut.MethodUnderTest();
        //Assert
        mockAwesome.Verify();
    }

    public interface IAwesome {
        void RunSomething();
    }

    public class myclass {
        private IAwesome awesomeObject;
        public myclass(IAwesome awesomeObject) {
            this.awesomeObject = awesomeObject;
        }
        public void MethodUnderTest() {
            this.awesomeObject.RunSomething(); //I want to verify that RunSomething was called
        }
    }
}

To confirm, comment out this.awesomeObject.RunSomething() in your sample class and run the test again. It will fail because you setup the RunSomething as Verifiable() and it was not used.

Upvotes: 1

Aydin
Aydin

Reputation: 15294

When testing, works perfectly fine for me...

Try this approach see if anything different results...

void Main()
{
    IAwesome awesome    = Mock.Of<IAwesome>();
    Mock<IAwesome> mock = Mock.Get(awesome);
    mock.Setup(m => m.RunSomething());

    MyClass myClass = new MyClass(awesome);
    myClass.MethodUnderTest();

    mock.Verify(m => m.RunSomething(), Times.Once);
}

public interface IAwesome
{
    void RunSomething();
}

public class MyClass
{
    private IAwesome awesomeObject;

    public myclass(IAwesome awesomeObject)
    {
        this.awesomeObject = awesomeObject;
    }

    public void MethodUnderTest()
    {
        this.awesomeObject.RunSomething();
    }
}

Upvotes: 1

Related Questions