Настройка moq и проверка того, что метод был вызван - PullRequest
16 голосов
/ 28 января 2012

Используя Microsoft Test Framework и Moq, я пытаюсь проверить, был ли вызван метод log4net.

    [TestMethod()]
    public void Log_Info_When_Stuff_Is_Done()
    {
        SampleClass sampleObject = new SampleClass(); 

        Mock<log4net.ILog> logMockObject = new Mock<log4net.ILog>();

        sampleObject.Log = logMockObject.Object;

        sampleObject.DoStuffAndLogInfo();

        logMockObject.Verify(moqLog => moqLog.Info("do stuff got called"), Times.AtLeastOnce());

    }

Я получаю исключение при вызове Verify, в котором говорится, что

Ожидаемый вызов на макет хотя бы один раз, но никогда не выполнялся: moqLog => moqLog.Info ("doматериал называется ") Нет настроек настроено.Вызовы не выполняются.

Что я делаю не так?

update проблема была с геттером для свойства SampleClas.Log.Я всегда возвращал LogManager.GetLogger(...);, даже когда свойство уже было установлено на ILogProxy.У меня сложилось впечатление, что метод доступа к свойству не будет вызываться, потому что я настроил прокси-сервер так: sampleObject.Log = logMockObject.Object;

Ответы [ 3 ]

34 голосов
/ 28 января 2012

Прямо сейчас Moq проверяет, что DoStuffAndLogInfo вызывает Info с точной строкой"делать вызовы".Если на самом деле он вызывает Info с другим аргументом, и вам все равно, что это за фактический аргумент, используйте вместо этого:

logMockObject.Verify(moqLog => moqLog.Info(It.IsAny<string>()), Times.AtLeastOnce()); 
1 голос
/ 28 января 2012

Тест настроен правильно.

Проверьте sut , чтобы узнать, действительно ли вызывается Log.Info в методе DoStuffAndLogInfo.

0 голосов
/ 29 ноября 2018

Это не похоже на проблему оригинального постера, но в моем случае у меня было очень похожее сообщение об ошибке.Это было из-за моего .Verify() вызова до фактического выполнения.Например, это неправильно :

SampleClass sampleObject = new SampleClass(); 
Mock<log4net.ILog> logMockObject = new Mock<log4net.ILog>();
logMockObject.Verify(moqLog => moqLog.Info(It.IsAny<string>()), Times.AtLeastOnce());
sampleObject.Log = logMockObject.Object;

sampleObject.DoStuffAndLogInfo();

.... но это право :

SampleClass sampleObject = new SampleClass(); 
Mock<log4net.ILog> logMockObject = new Mock<log4net.ILog>();
sampleObject.Log = logMockObject.Object;

sampleObject.DoStuffAndLogInfo();

logMockObject.Verify(moqLog => moqLog.Info(It.IsAny<string>()), Times.AtLeastOnce()); 
...