MOQ中Ref关键字的问题

时间:2016-09-07 14:26:23

标签: .net automated-tests moq

希望有人可以帮助我。

我正在尝试测试一个方法(外部方法),该方法具有作为依赖项的类,该类调用另一个方法(内部方法)。这个内部方法将布尔值作为参数参数,我的问题是我到目前为止无法控制这个布尔参考参数。

(注意 - 下面显示的代码是为了说明问题编写的,而不是代码的真实含义。)

此处的MOQ文档 - https://github.com/Moq/moq4/wiki/Quickstart 概述了处理Ref / Out参数,但我没有发现它有用。

我尝试了一个有效的例子(我在这里找到了 - Assigning out/ref parameters in Moq

public interface IService
{
    void DoSomething(out string a);
}

[Test]
public void Test()
{
    var service = new Mock<IService>();
    var expectedValue = "value";
    service.Setup(s => s.DoSomething(out expectedValue));

    string actualValue;
    service.Object.DoSomething(out actualValue);
    Assert.AreEqual(actualValue, expectedValue);
}

但是当我尝试我想要运行的代码时,我无法让它工作。 这包括在下面。

界面

Public Interface IGetValue
    Function GetValue(ByRef myBoolOfInterest As Boolean) As Single
End Interface

我想测试的代码

Public Class ClassToBeTested

    Dim isProblem As Boolean

    Public Function PassComparisonValues(m_GetValueGetter As IGetValue) As    Boolean

        Dim dPBar As Single = m_GetValueGetter.GetValue(isProblem)

        Return isProblem
    End Function
End Class

我为此测试的代码如下(注意 - 这是一个不同的项目)。

public void MethodToTest()
{
     // Arrange
     // System Under Test
     ClassToBeTested myClassToBeTested = new ClassToBeTested();

     // Construct required Mock
     Mock<IGetValue> myMock = new Mock<IGetValue>();
     bool isProblem = true;
     myMock.Setup(t => t.GetValue(ref isProblem));

     // Act
     isProblem = myClassToBeTested.PassComparisonValues(myMock.Object);

     // Assert
     Assert.That(isProblem, Is.EqualTo(true));
}

我想要的是能够在ClassToBeTested中控制isProblem的内容,我发现这没有发生。 无论我做什么,它都包含错误。

希望有人可以提供帮助。

1 个答案:

答案 0 :(得分:0)

您可以做的是在isProblem中保护ClassToBeTested。然后,仅从单元测试继承ClassToBeTested并将isProblem的值设置为预期值。

class ClassToBeTested
{
    protected bool isProblem;
    // code here ...
}

class TestableClassToBeTested 
    : ClassToBeTested
{
    public TestableClassToBeTested(bool isPRoblemValue)
    {
        isProblem = isPRoblemValue;
    }
}

public void MethodToTest()
{
    // Arrange
    // System Under Test
    bool isProblem = true;
    ClassToBeTested myClassToBeTested = new TestableClassToBeTested(isProblem);

    // code here ...
}