ASP.NET 使用 Moq 验证错误的控制器单元测试
ASP.NET Controller unittest using Moq verify error
我正在使用 asp.net 网络 api 构建 api 服务。我正在尝试使用最小起订量测试我的控制器,但出现以下错误
Expected invocation on the mock at least once, but was never
performed: 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);
}
}
IIncomeService.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);
}
问题是您正在尝试使用 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)));
我正在使用 asp.net 网络 api 构建 api 服务。我正在尝试使用最小起订量测试我的控制器,但出现以下错误
Expected invocation on the mock at least once, but was never performed: 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);
}
}
IIncomeService.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);
}
问题是您正在尝试使用 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)));