使用 String.String 类型的 Moq 对象对 RESTapi 进行单元测试,无法转换为 BaseObject



我正在尝试创建 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");

参考最小起订量:快速入门 - 自定义模拟行为

相关内容

最新更新