Unit tests and Moq'ing constructor parameter parameters

Question:

I'm currently trying to execute a unit test MVC4 WebApi project.

In the structure of this project, the facade class is used, which is introduced into the constructor of the corresponding controller. All of this is achieved through unity to maintain a close relationship with the absolute minimum.

Even the thought of Unity is implemented, in unit tests I install product controllers as follows:

var repositoryFacade = new RepositoryFacade(new RepositorySelector(new RepositoryGenerator()));

var productController = new ProductController(repositoryFacade)

The following code snippet shows the GetProducts method of the controller class:

public ProductController(IRepositoryFacade facade)
    {
        _facade = facade;

        productRepository = _facade.GetProductRepository();
    }

    public List<Product> GetProducts()
    {
        return productRepository.GetProducts();
    }

Where the code is currently located:

If I just want to check how many times this method got there, I tried to set up my UnitTest as follows using the Moq framework:

[TestMethod]
    public void Test_The_GetAllProducts_Method_is_Called()
    {

        var mockRepositoryGenerator = new Mock<IRepositoryGenerator>();

        var mockRepositorySelector = new Mock<IRepositorySelector>(mockRepositoryGenerator.Object);

        var mockFacade = new Mock<IRepositoryFacade>(mockRepositorySelector.Object);

        mockFacade.Setup(x => x.GetProductRepositoryV1().GetProducts());

        var productController = new ProductV1Controller(mockFacade.Object);

        var returnedProducts = productController.GetProducts();

        mockFacade.VerifyAll();
    }

Problem:

, :

Constructor arguments cannot be passed for interface mocks.

, Moq'ing , , , Unit Unit .

- , ?

+4
2

. :

public ProductController(IProductRepository productRepository)
{
    _productRepository = productRepository;
}

public List<Product> GetProducts()
{
    return _productRepository.GetProducts();
}

:

ProductV1Controller _productController;
Mock<IProductRepository> _mockRepository;

[TestInitialize]
public void TestInitialize()
{
    _mockRepository = new Mock<IProductRepository>();
    _productController = new ProductV1Controller(_mockRepository.Object);
}

[TestMethod]
public void ShouldLoadAllProducts()
{       
    _mockRepository.Setup(r => r.GetProducts()).Return(SomeProducts);

    var returnedProducts = _productController.GetProducts();

    Assert.Equals(returnedProducts, SomeProducts);
    _mockRepository.VerifyAll();
}
+1

( ):

var mockRepositoryGenerator = new Mock<IRepositoryGenerator>();

var mockRepositorySelector = new Mock<IRepositorySelector>(mockRepositoryGenerator.Object);

, Mock IRepositorySelector IRepositoryGenerator . , , .

, IRepositoryGenerator ( ), , :

var mockRepositoryGenerator = new Mock<IRepositoryGenerator>();

var mockRepositorySelector = new Mock<IRepositorySelector>();
mockRepositorySelector.Generator = mockRepositoryGenerator.Object;
+1

All Articles