簡體   English   中英

使用Moq進行交互單元測試

[英]interaction unit testing using Moq

我有一個測試班

    public class TerminationRequestValidation : ValidatorBase<TerminationRequest>
{
    public TerminationRequestValidation(IIntHR2BLLContext context) : base(context)
    {
    }

    public override ValidationResult ValidateWithoutThrow(TerminationRequest request)
    {
        var result = ValidationResult.Success;

        /* some logic */

        var isHRIAdvanced = Context.Logics.Accessible.HasAccess(request, IntHRSecurityOperationCode.TerminationRequestSetTerminationDateBehindhand);

        if (!isHRIAdvanced && Context.Logics.Termination.IsTerminationDateChanged(request))
        {
            result += CheckTerminationDate(request);                
        }

        return result;
    }

    public virtual ValidationResult CheckTerminationDate(TerminationRequest request)
    {
        var result = ValidationResult.Success;

        /* any validation logic */

        return result;
    }
}

我需要檢查“ CheckTerminationDate”方法是否已執行

        [TestMethod]
    public void Validate_TerminationDateChangedbyNotAdvanced_TerminationDateCheck()
    {
        var context = FakeContext.Create();
        // first stub
        var accessibleBllStub = new Mock<IAccessibleBLL>(MockBehavior.Loose);

        accessibleBllStub.Setup(z => z.HasAccess(It.IsAny<TerminationRequest>(), It.IsAny<IntHRSecurityOperationCode>()))

            .Returns<TerminationRequest, IntHRSecurityOperationCode>((x, y) => y != IntHRSecurityOperationCode.TerminationRequestSetTerminationDateBehindhand);

        context.StubBLL(z => z.Accessible, accessibleBllStub.Object);
        // second stub
        var terminationBLLStub = new Mock<ITerminationBLL>(MockBehavior.Loose);

        terminationBLLStub.Setup(z => z.IsTerminationDateChanged(It.IsAny<TerminationRequest>())).Returns(true);

        context.StubBLL(z => z.Termination, terminationBLLStub.Object);
        // mock
        var validator = new Mock<TerminationRequestValidation>(MockBehavior.Loose, context.MainContext);
        // act
        validator.Object.ValidateWithoutThrow(termination);
        //assert
        validator.Verify(z => z.CheckTerminationDate(It.IsAny<TerminationRequest>()));
    }

當然,此單元測試不起作用。 一方面,我需要調用真正的“ ValidateWithoutThrow”方法,另一方面,我需要檢查是否執行了存根方法“ CheckTerminationDate”。

伙計們,幫我找到最好的解決方案! 可能我需要重新設計測試課程以使測試更容易

我需要檢查“ CheckTerminationDate”方法是否已執行

你不知道 您需要測試該request已驗證。 無論是內聯完成,還是通過調用CheckTerminationDate ,或通過其他方法,這都是實現細節-單元測試並不關心這一點。

因此,您的測試應如下所示:

public void ValidateWithoutThrow_ReturnsSucessfulResult_When_RequestIsValid() 
{
    var validRequest = //...
    var validator = new TerminationRequestValidation(/*...*/); // don't mock this class

    var result = validator.TerminationRequestValidation(validRequest);

    Assert.Equal(ValidationResult.Success, result);
}

public void ValidateWithoutThrow_ReturnsUnsucessfulResult_When_RequestIsInvalid() 
{
    var invalidRequest = //...
    var validator = new TerminationRequestValidation(/*...*/); // don't mock this class

    var result = validator.TerminationRequestValidation(invalidRequest);

    Assert.NotEqual(ValidationResult.Success, result);
}

作為一般經驗法則,請避免驗證該方法在內部如何工作。 您正在將測試與實現細節耦合,並且重構/維護這些細節將是一個活生生的麻煩。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM