我如何使用Mock来测试我的控制器?

Wha*_*uce 0 c# asp.net-mvc unit-testing moq

我有一个控制器:

public class SelectController : Controller {
    private readonly IChartService _chartService;
    private readonly IProductService _productService;
    private readonly IStoreService _storeService;

    public SelectController ( IChartService chartService,
                              IProductService productService,
                              IStoreService storeService ) {
        _chartService = chartService;
        _productService = productService;
        _storeService = storeService;
    }

    [HttpGet]
    [Route( "stores" )]
    public Task<IEnumerable<IStore>> GetStoresInfo ( string encryptedUserId ) {
        return _storeService.GetStoresInfo( EncryptionProvider.Decrypt( encryptedUserId ) );
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试GetStoresInfo使用Moq 进行测试.这就是我到目前为止所做的一切:

[Fact]
public class Controller_Returns_List_Of_Stores()
{
    //Arrange
    var mockStoreService = new Mock<IStoreService>();
    var mockChartService = new Mock<IChartService>();
    var mockProductService = new Mock<IProductService>();



    var controller = new SelectController(mockChartService, mockProductService, mockStoreService);

    //Act
    //Assert
}
Run Code Online (Sandbox Code Playgroud)

新的SelectController不会接受我传递的3个对象,因为无法转换InServiceInService.我打算做更多的设置吗?或者它与返回类型是一个任务有关吗?

任何帮助非常感谢.

Nko*_*osi 5

调用.Object模拟来传递模拟对象.

 var controller = new SelectController(
     mockChartService.Object, 
     mockProductService.Object, 
     mockStoreService.Object
);
Run Code Online (Sandbox Code Playgroud)

您还需要设置模拟对象的行为,以便它们在调用时按预期运行.

IEnumerable<IStore> fakeData = new List<IStore>();

mockStoreService
    .Setup(_ => _.GetStoresInfo(It.IsAny<string>()))
    .Returns(Task.FromResult<IEnumerable<IStore>>(fakeData));
Run Code Online (Sandbox Code Playgroud)

参考Moq Quickstart以更好地理解如何使用模拟框架.