使用Moq,如何使用out参数模拟受保护的方法?

时间:2016-05-27 02:42:54

标签: c# unit-testing moq

对于像这样的方法:

protected virtual bool DoSomething(string str) { }

我经常嘲笑它:

var mockModule = new Mock<MyClass> { CallBase = true };
mockModule.Protected().Setup<bool>("DoSomething", ItExpr.IsAny<string>()).Returns(true);

但对于像这样的方法:

protected virtual bool DoSomething(out string str) { }

我该如何嘲笑它?

2 个答案:

答案 0 :(得分:5)

可以从moq 4.8.0-rc1(2017-12-08)开始。您可以使用out匹配mockModule.Protected().Setup<bool>("DoSomething", ItExpr.Ref<string>.IsAny).Returns(true); [TestClass] public class OutProtectedMockFixture { delegate void DoSomethingCallback(out string str); [TestMethod] public void test() { // Arrange string str; var classUnderTest = new Mock<SomeClass>(); classUnderTest.Protected().Setup<bool>("DoSomething", ItExpr.Ref<string>.IsAny) .Callback(new DoSomethingCallback((out string stri) => { stri = "test"; })).Returns(true); // Act var res = classUnderTest.Object.foo(out str); // Assert Assert.AreEqual("test", str); Assert.IsTrue(res); } } public class SomeClass { public bool foo(out string str) { return DoSomething(out str); } protected virtual bool DoSomething(out string str) { str = "boo"; return false; } } 参数的任何值。在你的情况下:

myFile.py

def get_value(data):#pass in data as input parameter
    output = process(data)#function to process data
    return output

模拟out参数的完整示例:

output

答案 1 :(得分:-3)

可以使用Typemock Isolator来完成,您可以模拟非公开方法并轻松更改其out和ref参数:

[TestMethod, Isolated]
public void test()
{
    // Arrange
    string str;
    SomeClass classUnderTest = new SomeClass();
    Isolate.NonPublic.WhenCalled(classUnderTest, "DoSomething").AssignRefOut("test").IgnoreCall();

    // Act
    classUnderTest.foo(out str);

    // Assert
    Assert.AreEqual("test", str);
}


public class SomeClass
{
    public void foo(out string str)
    {
        DoSomething(out str);
    }

    protected virtual bool DoSomething(out string str) 
    {
        str = "boo";
        return true;
    }
}

您可以阅读更多相关信息here