Как этот тест Moq работает в основном в отношении синтаксиса linq? - PullRequest
2 голосов
/ 08 октября 2009

Я смотрел это Введение в видео Moq на Dimecasts.net. В видео, когда парень настраивает свой тест moq, он имеет следующий код:

[Test]
public void TestWithMock()
{
    var mockEmailService = new Mock<IEmailService>();

    mockEmailService.Expect(x =>  
    x.SendEmail(It.IsAny<string>,It.IsAny<string>)).Returns(true);

    var emailer = new Emailer(mockEmailService.Object);

    emailer.SendBatchEmails();
}

Вот мои вопросы:

1) Проверяет ли moq все различные типы строк, проверяя метод SendBatchEmails? Я думаю, я немного запутался в том, как работает насмешка.

2) Может ли кто-нибудь объяснить лямбда-синтаксис части Expect?

3) У автора сначала были "," "в функции SendEmail, но это не удалось, поэтому он вместо этого поставил It.IsAny<string>, но мне все еще неясно, почему это не удалось с "", "".

Stackoverflow не помещает ключевое слово string в угловые скобки. (Fixed)

Ответы [ 3 ]

4 голосов
/ 08 октября 2009

1) Moq не влияет на работу SendBatchEmails, так как вы не издеваетесь над классом Emailer. Вместо этого вы издеваетесь над интерфейсом IEmailService, поэтому, если класс Emailer вызывает методы для объекта IEmailService, Moq будет перехватывать эти вызовы.

2) Вы говорите Moq, что ожидаете вызова метода SendEmail для IEmailService. Вы также говорите Moq, что когда вызывается SendEmail, вы хотите, чтобы Moq автоматически возвращал true.

Поскольку объект Moq передается в класс Emailer, этот тест будет проверять, вызывает ли код в SendBatchEmails метод SendEmail.

3) Ожидание реализуется, только если параметры совпадают. Если вы скажете Moq, что вы ожидаете, что SendEmail будет вызываться с "", "" в качестве параметров, а SendEmail вызывается с разными строками, произойдет сбой. It.IsAny<string>() указывает Moq сопоставить ожидание с любой строкой в ​​качестве параметра.

1 голос
/ 08 октября 2009

1) Что вы имеете в виду, разные типы строк? Есть только один тип строки ... это строка.

Что делает насмешка, так это автоматически создает новый тип объекта, который реализует предоставленный интерфейс или абстрактный класс. В этом случае Moq сгенерирует новый тип класса с именем, похожим на что-то вроде «IEmailService_a324bc54ff123827d». В этом типе будут реализованы все методы интерфейса IEmailService, возвращающие значение null.

3) Я отвечу на этот вопрос раньше (2). Причина сбоя "", "" заключается в том, что он регистрировал ожидаемый вызов mockEmailService.SendMail ("", ""). Если он вызывается с другими параметрами, ожидание не будет выполнено. Использование IsAny () означает, что вы не заботитесь о значениях параметров, вы просто ожидаете, что вызов метода произойдет.

И, наконец, (2) - синтаксис регистрирует ожидание в Moq. Метод Expect () просто запрашивает метод, который будет вызван, поэтому в данном случае mockEmailInstance.SendMail () с любыми параметрами.

1 голос
/ 08 октября 2009

Он не перебирает все строки, настроенное ожидание будет просто соответствовать любой строке, указанной при вызове SendEmail, возвращая истинный результат. Лямбда внутри ожидания устанавливает соответствие вызова функции для объекта, для которого установлено ожидание, в данном случае mockEmailService. Переменная x здесь принимает значение объекта, который является объектом ожидания. Метод, которому он будет соответствовать на этом объекте, - это SendEmail, и в дальнейшем он будет совпадать, когда SendEmail вызывается с любыми строковыми параметрами. Когда ожидается ожидаемый вызов, он вернет значение true.

Предположительно, причина, по которой изначально произошел сбой, заключается в том, что SendEmail был вызван с парой параметров, которые не соответствуют "", "". Это означало, что ожидание не было оправдано, и поэтому оно не вернулось. Тот факт, что ожидание не было выполнено, вероятно, не прошел тест, хотя также могло случиться, что SendBatchEmail не удалось, когда метод вернул false.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...