我有一个控制器:
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个对象。我打算做更多的设置吗?或者它与返回类型是一个任务有什么关系?
任何帮助都非常感激。
答案 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以更好地理解如何使用模拟框架。