c# MOQ नकली शून्य विधि जो एक फ़ील्ड मान बदलता है




mocking (2)

मैं MOQ और मॉकिंग के लिए नया हूँ
मान लीजिए मेरे पास एक ऐसा वर्ग है, जो एक शून्य विधि के साथ बदलता है जो मान बदलता है:

public class Sample
{
    public virtual int Number { get; set; }

    public virtual void Check(int a)
    {
        this.Number = a > 10 ? this.Number = 100 : this.Number = 200;
    }
}

मुझे यह सुनिश्चित करने के लिए शून्य विधि का परीक्षण करना है कि वह स्थानीय फ़ील्ड Number बदल रहा है।

[Fact]
public void TestSampleClass()
{
    var sut = new Mock<Sample>();
    sut.Setup(s => s.Number).Returns(50);           

    sut.Setup(s => s.Check(It.IsAny<int>())).Callback(
        (int testNumber) =>
        {
            if (testNumber > 10)
            {
                sut.Setup(s => s.Number).Returns(100);
            }
            else
            {
                sut.Setup(s => s.Number).Returns(200);
            }                   
        });
}

ऐसा लगता है कि विधि 100 या 200 के लिए मान नहीं बदलती है ... अगर मैं sut.Object.Number मुद्रित करता sut.Object.Number यह प्रारंभिक मान देता है, शून्य कॉल के बाद अद्यतित नहीं है।


जब तक आपका उदाहरण अधिक जटिल समस्या का सरल प्रतिनिधित्व नहीं होता है, Sample वर्ग का नकली करने की कोई आवश्यकता नहीं है।

[Fact]
public void TestSampleClass()
{
    //Arrange
    var testNumber = 5; //Could be what ever number you want to test
    var expected = 200
    var sut = new Sample();

    //Act
    sut.Check(testNumber);
    var actual = sut.Number;

    //Assert
    Assert.AreEqual(expected, actual);
}

यदि यह उद्देश्य इस विशेष स्थिति में इस तरह के परीक्षण को कैसे करना सीखना था तो आप ऐसा कुछ कर सकते हैं ...

यह मानते हुए कि आप निम्नलिखित इंटरफ़ेस पर Check विधि Check चाहते हैं ...

public interface ISample {
    int Number { get; set; }
    void Check(int a);
}

जहां अपेक्षित व्यवहार विधि के मूल्य को बदलने के लिए है, तो आप इसे सेट अप कर सकते हैं।

[Fact]
public void TestISampleCheck() {
    //Arrange
    var testNumber = 5; //Could be what ever number you want to test
    var expected = 200;
    var mock = new Mock<ISample>();

    //Specifies that the all properties on the mock should have "property behavior",
    //meaning that setting its value will cause it to be saved and later returned
    //when the property is requested. (this is also known as "stubbing"). The default
    //value for each property will be the one generated as specified by the Moq.Mock.DefaultValue
    //property for the mock.
    mock.SetupAllProperties();

    var sut = mock.Object;

    mock.Setup(s => s.Check(It.IsAny<int>()))
        .Callback((int a) => {
            if (a > 10) {
                sut.Number = 100;
            } else {
                sut.Number = 200;
            }
        });

    //Act
    sut.Check(testNumber);
    var actual = sut.Number;

    //Assert
    Assert.AreEqual(expected, actual);
}

Callback विधि विधि के व्यवहार को निर्धारित करता है, कुछ परिवर्तन करने के लिए आपको वास्तव में sut.Object.Check(11); विधि यानी sut.Object.Check(11); कॉल करने की ज़रूरत है sut.Object.Check(11); , तो आप अपने परिणामों का दावा कर सकते हैं।





moq