我們有一個服務正在另一個服務中使用:
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:需要對模擬進行一次調用,但調用次數為0次:x=>x.ValidateLineCount(It.IsAny())
根據您給出的moq,將不會調用驗證服務方法,因為調用
GetLineCount
時拋出異常,因此測試失敗。而不是設置此最小起訂量
試試這個