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

时间:2018-01-29 19:48:37

标签: c# asp.net-mvc unit-testing moq

我有一个控制器:

class Semester < ApplicationRecord
  enum season: {
      fall: 'fall',
      winter: 'winter',
      spring: 'spring',
      summer: 'summer'
  }
end

我正在尝试使用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 ) ); } } 。这就是我到目前为止所做的一切:

GetStoresInfo

[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 } 因为无法从SelectController转换为InService而无法接受我传入的3个对象。我打算做更多的设置吗?或者它与返回类型是一个任务有什么关系?

任何帮助都非常感激。

1 个答案:

答案 0 :(得分:5)

在模拟上调用 var controller = new SelectController( mockChartService.Object, mockProductService.Object, mockStoreService.Object ); 以传递模拟对象。

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

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

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

curl -X POST https://KEY:SECRET@www.sendowl.com/api/v1/products.xml -F 
"product[name]=Test" -F "product[product_type]=digital" -F 
"product[price]=12.50" -F "product[attachment]=@/filepath.png"

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