Как проверить вызов метода с правильным параметром? - PullRequest
2 голосов
/ 21 апреля 2011

У меня есть метод, который вызывает другой метод для смоделированного объекта с параметром, который вычисляется в соответствии с параметрами, которые я передал в мою тестируемую функцию.
Как проверить, что метод, который вызывает мой проверенный метод, вызывается правильно.
Я использую Moq.

EDIT:
Поскольку никто из вас не понимает, что я имею в виду (или поскольку я не понимаю, что вы, ребята, решили эту проблему для меня), я буду более конкретным.
У меня есть следующий метод подписи:

IAsyncResult BeginWrite(byte[] buffer, int offset, int size, AsyncCallback callback, object state);

Внутри него следует создать экземпляр объекта SocketAsyncEventArgs и вызвать его метод SetBuffer с правым SocketAsyncEventArgs.
SocketAsyncEventArgs - это подробность реализации , но, тем не менее, это единственный способ реализовать нужную мне функцию, поэтому я должен проверить, правильно ли вызывается метод SetBuffer. Как мне убедиться, что реализация BeginWrite () действительно вызывает SetBuffer с правильными параметрами?

Редактировать 2:
Вот некоторый код, чтобы уточнить, что я имею в виду:

public IAsyncResult BeginWrite(byte[] buffer, int offset, int size, AsyncCallback callback, object state)
{
    // No mocking can be done here
    SocketAsyncEventArgs args = new SocketAsyncEventArgs
                                    {
                                        // Proper initialization. Should be verified as well.
                                    };
    args.SetBuffer(buffer, offset, size);
    Client.SendAsync(args);
}

Ответы [ 3 ]

6 голосов
/ 21 апреля 2011

Вы можете проверить, вызывается ли метод с помощью метода Verify. Если вызываемый метод ничего не возвращает, тогда вам не нужно Setup. Я предпочитаю это, чем подход Setup или Expect / VerifyAll, так как это больше AAA.

[Test]
public void ShoudlCallMockMethod()
{
    var mocked = new Mock<IDoStuff>();

    var target = new ClassToTest(mocked.Object);
    target.DoStuff();

    mocked.Verify(x => x.CallMyMethod(It.IsAny<string>());
}

здесь ожидается, что вызов CallMyMethod с любым аргументом. Если вы знаете точный аргумент и хотите это проверить, тогда выполните

mocked.Verify(x => x.CallMyMethod("exactstring"));

если вы хотите более сложное сопоставление того, что было передано (полезно для сложных объектов со многими аргументами), тогда посмотрите другой ответ, который я сделал с использованием средства сопоставления .

Вы также можете добавить Times.AtMostOnce (), если хотите, чтобы он вызывался только один раз

[Изменить]

Исходя из ваших правок и комментариев, вам не нужно макетировать объект args, но если вы все еще хотите проверить, установлены ли параметры, вы можете проверить это методом Client.SendAsync, при условии, что его можно смоделировать (что я бы сделал предложить вам стремиться к, если вы еще этого не сделали). Ссылка, которую я привел о совпадениях, должна помочь в этом.

Что касается вашего вопроса в вашем комментарии, то за последние несколько лет произошел сдвиг от записи / воспроизведения-проверки> ожидания / настройки-проверки> [настройки] -проверя. Это может быть связано с технологией насмешки, но в основном из-за введения лямбда-выражений в c # 3.5, а затем перехода на AAA. Что вам действительно нужно, так это небольшие читаемые тесты, которые следуют принципу AAA, так что Expect / Setup-VerifyAll действительно имеет утверждение в фазе Arrange (вы должны оглянуться назад, чтобы увидеть, что проверяется). Поэтому, если проверяемый метод не должен что-то возвращать, тогда вам не нужны установки, просто убедитесь, что метод был вызван на этапе подтверждения.

1 голос
/ 21 апреля 2011

Полагаю, он проверит, что аргумент, который вы передаете при вызове Setup, равен аргументу, передаваемому реальным кодом.

Краткое руководство по содержит примеры более интересных ограничений. К сожалению, ссылки на руководство внешнего API на данный момент не работают: (

РЕДАКТИРОВАТЬ: Я подозреваю вы хотите что-то вроде:

mock.Setup(foo => foo.SendAsync(It.Is<AsyncCallback>(x => 
           {
               // Whatever you need to test here
               return x.Buffer.Length == 15 && 
                   x.Offset = 10 &&
                   x.Count = 5;
           }));
0 голосов
/ 21 апреля 2011

Приведенный ниже тест не пройден из-за ожидания установки параметра с именем value, переданного как «ожидаемый», не выполненного.Я думаю, что это то, что вы после?

[TestClass]
public class MyTests
{
    [TestMethod]
    public void TestParameterExpectation()
    {
        var mock = new Mock<IInterface>();
        mock.Setup(x => x.CallMe("expected"));

        CallIt("not expected", mock.Object);

        mock.VerifyAll();

    }

    public void CallIt(string value, IInterface callit)
    {
        callit.CallMe(value);
    }

}

public interface IInterface
{
    void CallMe(string value);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...