我正在尝试创建 RESTApi 的单元测试,但是当我尝试调用 .来自控制器的 Get{id} 方法。
(控制器被嘲笑,因为它是抽象的(
当我到达测试的最后一行时,我收到错误(标题(。
(我已经尝试过断言和.验证((的,但我没有联系到他们,因为我在到达他们之前就出错了(
我觉得我错过了一些小东西,但话又说回来,这是我第一次使用 Moq。
protected CustomActionModelController(IModelProvider<TModel> provider, IModelMapper mapper)
{
_mapper = mapper;
_provider = provider;
_customActions = new Dictionary<string, Func<string, object, object>>();
InitializeCustomActions();
}
protected abstract void InitializeCustomActions();
[HttpGet("{id}")]
[Produces(DefaultContentType)]
public virtual TDto Get([FromRoute]string Id)
{
return ToDto(_provider.Get(Id));
}
[TestMethod]
public void GetWithIdParameterReturnsSingleObject()
{
var provider = new Mock<IModelProvider<BaseDomainModel>>();
var mapper = new Mock<IModelMapper>();
var services = new Mock<IServiceCollection>();
var builder = new AutofacBuilder();
builder.RegisterType<IModelProvider<BaseDomainModel>, FakeDataProvider>().SingletonScope();
var customMock = new Mock<CustomActionModelController<BaseDomainModel, BaseObjectDto>>(provider.Object, mapper.Object);
customMock.Setup(x => x.Get(It.IsAny<string>())).Returns((BaseObjectDto s) => s = new BaseObjectDto("Test", "test"));
var actual = customMock.Object.Get("1");
}
不要设置被测方法。在模拟上使用CallBase
var customMock = new Mock<CustomActionModelController<BaseDomainModel, BaseObjectDto>>(provider.Object, mapper.Object) {
// Whether the base member virtual implementation
// will be called for mocked classes if no setup is matched.
CallBase = true
};
var actual = customMock.Object.Get("1");
参考最小起订量:快速入门 - 自定义模拟行为