【问题标题】:Mocking parameterized asynchronous method模拟参数化异步方法
【发布时间】:2019-01-11 20:08:09
【问题描述】:
    var controller = new Mock<JobOfferController>(context);
controller.Setup(m => m.UploadCvToAzureStorage(It.IsAny<IFormFile>()))
.Returns(Task.FromResult("cv-url"));

这部分代码返回以下错误:“System.NotSupportedException:非虚拟(在 VB 中可覆盖)成员成员的设置无效:m => m.UploadCvToAzureStorage(It.IsAny())”。任何想法如何解决它?

【问题讨论】:

    标签: c# mocking


    【解决方案1】:

    Moq 不会模拟具体类的非虚拟成员,因为它无法覆盖运行以实现您的设置的代码。您需要模拟该类实现的接口。

    如果你有这个:

    public interface IJobOfferController
    {
        Task<string> UploadCvToAzureStorage(IFormFile file);
    }
    
    public class JobOfferController : IJobOfferController
    {
        public Task<string> UploadCvToAzureStorage(IFormFile file) => throw new NotImplementedException();
    }
    

    那么你的设置将是:

    public void SetUp()
    {
        //this is trying to mock the concrete class and will fail
        var controller = new Mock<JobOfferController>(context);            
        controller.Setup(m => m.UploadCvToAzureStorage(It.IsAny<IFormFile>()))
            .Returns(Task.FromResult("cv-url"));
    
    
        //This Mocks the interface and sets up a return value for that interface
        var mockController = new Mock<IJobOfferController>();
        mockController.Setup(m => m.UploadCvToAzureStorage(It.IsAny<IFormFile>()))
            .Returns(Task.FromResult("cv-url"));
    }
    

    此外,当您模拟异步方法时,您可以删除 .FromResult 并使用 ReturnsAsync

    controller.Setup(m => m.UploadCvToAzureStorage(It.IsAny<IFormFile>()))
        .ReturnsAsync("cv-url");
    

    或者

    如果您的控制器没有接口,另一种选择是将控制器的方法设为虚拟,以便 Moq 可以用您的设置覆盖它:

    public class JobOfferController : IJobOfferController
    {
        public virtual Task<string> UploadCvToAzureStorage(IFormFile file) => throw new NotImplementedException();
    }
    
    //now the setup works
    var controller = new Mock<JobOfferController>(context);            
    controller.Setup(m => m.UploadCvToAzureStorage(It.IsAny<IFormFile>()))
        .ReturnsAsync("cv-url");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-31
      • 2015-10-09
      • 2013-08-25
      • 1970-01-01
      • 2014-01-30
      • 2014-01-27
      • 1970-01-01
      相关资源
      最近更新 更多