MOQ - Как проверить статический вызов класса и делегатов? - PullRequest
3 голосов
/ 27 января 2011

Я только начал читать на Moq Framework и подумал о применении его в моем существующем коде.Я мог бы придумать контрольный пример для проверки вызовов основных функций.Но теперь застрял в применении его к делегатам и статическим классам.

Ниже находится тестируемая система (SUT)

public class SUT : ISUT
{
   private IInterface1 i1;,
   private IInterface2 i2;

   public SUT(IInterface1 i1, IInterface2 i2)
   { 
      this.i1 = i1;
      this.i2 = i2;
   }

   public void FunctionToTest(Action<string> someDelegate, Action otherDelegate)
   {
       var list = i2.GetList();

       foreach(var r in list)
       {
      i1.SomeFunction(r);

          if(someDelegate != null)
              someDelegate("message");                        

          SomeHelper.LogData(r);
       }   

       if(otherDelegate != null)    
             otherDelegate();
   }
}

Я настроил свой тест следующим образом

[TestFixture]
public class when_list_contains_atleast_one_item
{
   ISUT sut;
   Mock<IInterface1> mockI1;
   Mock<IInterface2> mockI2;

   public SUT_Tester()
   {
       mockI1 = new Mock<IInterface1>();
       mockI2 = new Mock<IInterface2>();
       sut = new SUT(mockI1.Object, mockI2.Object);
   }

   [Test]
   public void it_should_call_somefunction_calldelegates_and_log_data()
   {
       var dummyList = new List<string> { "string1", "string2" };
       mockI2.Setup(m2 => m2.GetList()).Returns(dummyList).Verifiable();

       sut.FunctionToTest(It.IsAny<Action<string>>(), It.IsAny<Action>());   

       // How to verify delegates were raised
       // How to verify SomeHelper.LogData was called                

       mockI1.Verify(m => m.SomeFunction(It.IsAny<string>()), Times.Exactly(2));
       mockI2.Verify();
   }
}

Как проверить, что someDelegate и otherDelegate были подняты?SomeHelper - это статический класс, а LogData - статическая функция.Как проверить, что LogData был вызван?

Ниже приведен класс SomeHelper

public static class SomeHelper
{
    static ILogger logger = LoggerManager.GetLogger("Something");
    public static void LogData(string input)
    {
        logger.Info(input);
    }
}

Ответы [ 2 ]

4 голосов
/ 27 января 2011
  • Вы не можете проверить статические методы, так как они не могут быть смоделированы Moq.
  • Чтобы проверить вызовы делегатов, создайте их так, чтобы они вызывали локальную функцию, и вы сохранитеукажите и подтвердите:

    string localString = string.Empty;

    Action<string> action = (string s) => localString = s;

    // ... pass it to the test

    Assert.(localString == "TheStringItMustbe");

(ОБНОВЛЕНИЕ)

ОК, чтобы проверить действие, которое не имеет параметров, увеличить локальную переменную и подтвердить, было ли оно увеличено (или что-то подобное):

int localVar = 0;
Action action = () => localVar++;
// ... pass it to the test
Assert.(localVar == 1);
1 голос
/ 27 января 2011

Возможно, вы захотите изменить интерфейсы IInterface1 / 2, чтобы они либо принимали ILogger в качестве параметра в SomeFunction, либо имели настраиваемое свойство ILogger.

Тогда вы можете передать имитированный ILogger в SomeFunction.

...