C# ASP.NET控制器单元测试使用Moq验证错误

C# ASP.NET控制器单元测试使用Moq验证错误,c#,asp.net,unit-testing,moq,C#,Asp.net,Unit Testing,Moq,我正在使用asp.NETWebAPI构建一个api服务。我试图使用moq测试我的控制器,但我得到以下错误 至少应在模拟上调用一次,但从未调用 已执行:x=>x.CreateIncome() 这是下面的测试 [TestClass] public class IncomeControllerTests { private Mock<IIncomeService> _incomeServiceMock; [TestInitialize] public void Be

我正在使用asp.NETWebAPI构建一个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));
    }
}
IIncomeService.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);
    }
}
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);
}
公共接口IIncomeService
{
无效收入(收入);
收入获取收入(int id);
列出GetAllIncome();
字典GetMonthlyIncome();
字典GetYearlyIncome();
无效更新(收入);
}

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

您可以将verify语句更改为

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

\u incomeServiceMock.Verify(x=>x.CreateIncome(It.Is(inc=>
inc.Description==新收入。Description
&&公司金额==新收入金额
&&inc.StuffId==newIncome.StuffId));
_incomeServiceMock.Verify(x => x.CreateIncome(It.Is<Income>(inc=>
    inc.Description == newIncome.Description 
    && inc.Amount == newIncome.Amount 
    && inc.StuffId == newIncome.StuffId)));