2016-09-07 3 views
1

Надеюсь, кто-то может мне помочь.Проблемы с ключевым словом Ref в MOQ

Я пытаюсь проверить метод (внешний метод), который имеет в качестве зависимости класс, вызывающий другой метод (Внутренний метод). Этот внутренний метод принимает логическое значение как параметр Ref, и моя проблема в том, что я до сих пор не смог контролировать этот параметр Boolean Ref.

(Примечание. Код, показанный ниже, был написан с целью иллюстрации проблемы и не похож на код).

Документация MOQ отсюда - https://github.com/Moq/moq4/wiki/Quickstart дает обзор работы с Ref/Out parms, но я не нашел его полезным.

Я попробовал пример, который работает (который я нашел здесь - 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)); 
} 

То, что я хочу, чтобы иметь возможность контролировать содержание isProblem в ClassToBeTested, и я нахожу, что это не происходит. Он содержит ложь независимо от того, что я делаю.

Надеюсь, кто-то может помочь.

+0

Я бы попросил автора библиотеки. – Max

ответ

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 ... 
}