我们有一个服务正在另一个服务中使用:
namespace ConsoleCalculator.Services
{
public interface ICalculatorService
{
int GetLineCount(string inputLineCount);
}
}
namespace ConsoleCalculator.Services
{
public class CalculatorService : ICalculatorService
{
private readonly ICalculatorValidationService _calculatorValidationService;
public CalculatorService(ICalculatorValidationService calculatorValidationService)
{
_calculatorValidationService = calculatorValidationService;
}
public int GetLineCount(string inputLineCount)
{
_calculatorValidationService.ValidateLineCount(inputLineCount);
return Convert.ToInt32(inputLineCount);
}
}
}
现在我们需要为所需的服务编写一个测试:
namespace ConsoleCalculator.Test.Services
{
public class CalculatorServiceTest
{
private Mock<ICalculatorService> _calculatorService = new Mock<ICalculatorService>();
private Mock<ICalculatorValidationService> _valculatorValidationService = new Mock<ICalculatorValidationService>();
public CalculatorServiceTest()
{
_valculatorValidationService
.Setup(q => q.ValidateLineCount(It.IsRegex("[^0-9]")))
.Throws(new Exception());
_calculatorService
.Setup(q => q.GetLineCount(It.IsRegex("[^0-9]")))
.Throws(new Exception());
}
[Fact]
public void When_Input_Not_A_Number_Should_Return_Exception()
{
Assert.Throws<Exception>(() => _calculatorService.Object.GetLineCount("123a"));
}
[Fact]
public void When_Call_Method_Should_Call_Exactaly_One_ValidateLineCount_Method()
{
_calculatorService.Object.GetLineCount(It.IsAny<string>());
_valculatorValidationService.Verify(x => x.ValidateLineCount(It.IsAny<string>()), Times.Once);
}
}
}
编写第二个测试的目的是确保我的测试服务被调用一次。但在运行测试时,我看到以下错误:
Moq.MockException:需要对mock调用一次,但为0次数:x=>x.ValidateLineCount(It.IsAny(((
根据您给出的moq,验证服务方法将不会被调用,因为在调用GetLineCount
时引发异常,因此测试失败。
而不是设置此moq
_calculatorService
.Setup(q => q.GetLineCount(It.IsRegex("[^0-9]")))
.Throws(new Exception());
试试这个
[Fact]
public void When_Call_Method_Should_Call_Exactaly_One_ValidateLineCount_Method()
{
var calSrvc = new CalculatorService(_valculatorValidationService.Object);
calSrvc.Object.GetLineCount(It.IsAny<string>());
_valculatorValidationService.Verify(x => x.ValidateLineCount(It.IsAny<string>()), Times.Once);
}