Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Moq testing void method

Hi I am new to Moq testing and having hard time to do a simple assertion. I am using an interface

 public interface IAdd
 {
     void add(int a, int b);
 }

Moq for the IAdd interface is:

  Mock<IAdd> mockadd = new Mock<IAdd>();
  mockadd.Setup(x => x.add(It.IsAny<int>(), It.IsAny<int>()).callback((int a, int b) => { a+b;});
  IAdd testing = mockadd.Object;

Since the add method is void, it doesn't return any value to Assert with. How can I assert this setup?

like image 595
J. Davidson Avatar asked Feb 25 '13 07:02

J. Davidson


People also ask

What is the best way to unit test a method that doesn't return anything void )?

The most popular option to verify the output when testing the void method is to use the mock object. A mock object is an object that replicates the behavior of a real object for the purposes of unit testing.

Can you mock a private method Moq?

Moq supports mocking protected methods. Changing the methods to protected , instead of private , would allow you to mock their implementation.


2 Answers

Why mocking is used? It used for verifying that SUT (system under test) interacts correctly with its dependencies (which should be mocked). Correct interaction means calling correct dependency members with correct parameters.

You should never assert on value returned by mock. That is dummy value which has no relation to production code. The only value you should assert on is a value returned by SUT. SUT is the only thing you should write assertions for.

Also you should never test interfaces. Because there is nothing to test. Interface is just a API description. It has no implementation. So, stop and think about what code are you testing here? Is this is a real code, which executed in your application?

So, you should mock IAdd interface only for testing object which uses IAdd interface.

like image 64
Sergey Berezovskiy Avatar answered Oct 06 '22 05:10

Sergey Berezovskiy


Better to provide more context, but typically it used like this:

var mockAdd = new Mock<IAdd>();
mockAdd.Setup(x => x.Add(1, 2)).Verifiable();

//do something here what is using mockAdd.Add

mockAdd.VerifyAll();
like image 27
Pavel Bakshy Avatar answered Oct 06 '22 03:10

Pavel Bakshy