Moq с тем же аргументом в настройке и проверке - PullRequest
2 голосов
/ 25 апреля 2019

Все часто я пишу одно и то же выражение аргумента в Setup и Verify.Есть ли способ сделать ссылку на них?


Что я пишу:

var mock = new Moq<IFoo>();
mock.Setup(m => m.MyMethod(It.Is.Any<string>());
...
mock.Verify(m => m.MyMethod(It.Is.Any<string>()), Times.Once);

Тогда у меня есть идея, что Setup и Verify имеют одинаковые значенияпараметр, который он должен / мог бы быть перемещен в общую ссылку, например:

var MyMethodCall = {WHAT SHOUD BE HERE?};
var mock = new Moq<IFoo>();
mock.Setup(m => MyMethodCall);
...
mock.Verify(m => MyMethodCall, Times.Once);

Ответы [ 2 ]

4 голосов
/ 25 апреля 2019

Вы можете создать переменную, которая содержит выражение, чтобы вы могли использовать его повторно:

Expression<Action<IFoo>> expression = x => x.MyMethod(It.Is.Any<string>());

var mock = new Moq<IFoo>();
mock.Setup(expression);
...
mock.Verify(expression, Times.Once);
1 голос
/ 26 апреля 2019

В этом случае вы можете использовать Verifiable, тогда вам вообще не нужно указывать параметры в Verify. Он проверит, что конкретный проверяемый Setup был вызван.

var mock = new Moq<IFoo>();
mock.Setup(m => m.MyMethod(It.Is.Any<string>()).Verifiable();
...
mock.Verify();

IMO Verifiable - лучший выбор, так как Verify(Expression<>) не работает с настройками, но вызывает внутренне. Объяснение ниже:

public class Example
{
    public bool IsValid { get; set; }
}

public interface IExample
{
    bool Do(Example e);
}

// arrange
Expression<Func<IExample, bool>> expr = m => m.Do(It.Is<Example>(x => x.IsValid));
var mock = new Mock<IExample>();
mock.Setup(expr).Verifiable();

// act
var example = new Example {IsValid = true};
mock.Object.Do(example);
example.IsValid = false;

// assert
mock.Verify(expr, Times.Once);

Каким будет результат? Тест не удастся , поскольку Verify будет вычислять выражение после изменения объекта. Если вы используете Verify, то вызов будет перехвачен в момент вызова. Однако это просто витрина, не должно случаться так часто:)

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