【问题标题】:ASP.NET Controller unittest using Moq verify error使用 Moq 验证错误的 ASP.NET 控制器单元测试
【发布时间】:2016-12-20 09:06:05
【问题描述】:

我正在使用 asp.net web api 构建一个 api 服务。我正在尝试使用 moq 测试我的控制器,但出现以下错误

预期至少在模拟上调用一次,但从来没有 执行:x =>x.CreateIncome())

这是下面的测试

[TestClass]
public class IncomeControllerTests
{
    private Mock<IIncomeService> _incomeServiceMock;
    [TestInitialize]
    public void BeforeEachTest()
    {
        _incomeServiceMock = new Mock<IIncomeService>();

        _incomeServiceMock
            .Setup(x => x.CreateIncome(It.IsAny<Income>())).Verifiable();
    }

    [TestMethod]
    public void Income_Is_Saved_Successfully()
    {
        var incomeController = new IncomeController(_incomeServiceMock.Object);
        Income newIncome = {
            Description = "Income1",
            Amount = 22300,
            Id = 221,
            StaffId = sampleManager.Id,
            Staff = sampleManager,
            DateCreated = DateTime.Now
        }

        incomeController.Post(newIncome);
        _incomeServiceMock.Verify(x => x.CreateIncome(newIncome));
    }
}

在这个控制器中使用的服务被注入到我的IncomeController 中,如下所示

IncomeController.cs

[Authorize]
public class IncomeController : ApiController
{
    private IIncomeService _incomeService;
    public IncomeController(IIncomeService service)
    {
        _incomeService = service;
    }

    public void Post([FromBody]Income values)
    {
        Income income = new Income(
            values.Description,
            values.Amount,
            values.StaffId
            );

        _incomeService.CreateIncome(income);
    }
}

IIcomeService.cs

public interface IIncomeService
{
    void CreateIncome(Income income);
    Income GetIncome(int id);
    List<Income> GetAllIncome();
    Dictionary<string, int> GetMonthlyIncome();
    Dictionary<string, int> GetYearlyIncome();
    void Update(Income income);
}

【问题讨论】:

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


    【解决方案1】:

    问题是您尝试使用newIncome 对象进行验证,但在Post 方法中,您实例化了Income 的不同实例并将其传递给服务。这些实例并不相同。

    您可以将您的验证语句更改为类似

    _incomeServiceMock.Verify(x => x.CreateIncome(It.IsAny<Income>()));
    

    _incomeServiceMock.Verify(x => x.CreateIncome(It.Is<Income>(inc=>
        inc.Description == newIncome.Description 
        && inc.Amount == newIncome.Amount 
        && inc.StuffId == newIncome.StuffId)));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-04
      • 1970-01-01
      • 2013-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-03
      相关资源
      最近更新 更多