FakeItEasy VB.NET проблемы с параметрами - PullRequest
0 голосов
/ 15 апреля 2011

Хорошо, я пытаюсь научить себя тестированию с использованием фиктивной инфраструктуры, и я работаю в VB.NET, я новичок в лямбда-выражениях, и все мои предыдущие приложения были написаны в версии 2005 или более ранней.У меня сейчас 2010 год. Итак, я попробовал Rhino.Mocks, но мне было трудно разобраться с этим в основном из-за более старого синтаксиса.Поскольку в наши дни никто не ведет блог в VB.NET, я изучал примеры на C # и пытался выяснить, что происходит.

Поэтому у меня есть ситуация, когда я передаю интерфейсконструктор класса и содержит ссылку на этот интерфейс.Когда вызывается метод для объекта, а событие вызывается, это должен обрабатывать класс, реализующий интерфейс.

У меня возникли проблемы, поэтому я попытался создать простую версию на C # и повторить шаги, описанные вvb.net.

Итак, мой интерфейс:

public interface IBroadcastClient
{
   void MessageReceivedHandler(string msg);
}

Класс, который вызывает события:

public class Broadcaster
{     
    public Broadcaster(IBroadcastClient c)
    {
        _client= c;
        this.SendMessage += new MessageReceived(_client.MessageReceivedHandler);
    }
    private IBroadcastClient _client;


    public event MessageReceived SendMessage;

    public void SendMessageNow()
    {
        string _Message;
        if (SendMessage != null)
        {
            _Message = @"Yay!";
            SendMessage(_Message);
        }
    }
}

Тест:

[TestMethod]
public void TestSendMessageWithIgnoreParameter()
{
    //string msg = @"Yay!";
    var client = A.Fake<IBroadcastClient>();
    Broadcaster b = new Broadcaster(client);
    b.SendMessageNow();
    A.CallTo(() => client.MessageReceivedHandler(A<string>.Ignored)).MustHaveHappened();
}

Это проходит, проблем пока нет.

Теперь попробуем то же самое в vb.net;Тот же интерфейс и класс Broadcaster, только в vb.net, а не в C #, с первоначально hte после модульного тестирования.

<TestMethod()>
Public Sub TestMethod1()
    Dim client = A.Fake(Of IBroadcastClient)()
    Dim b As New Broadcaster(client)
    b.SendMessageNow()
    NextCall.To(client).MustHaveHappened()
    client.MessageReceivedHandler(A(Of String).Ignored)

End Sub

Это происходит со следующим сообщением об ошибке;"Утверждение не удалось для следующего вызова: TestFakeItEasyVB.IBroadcastClient.MessageReceivedHandler (msg:) Ожидается найти его хотя бы один раз, но нашел его # 0 раз среди вызовов: 1: TestFakeItEasyVB.IBroadcastClient.MessageReceivedHandler (msg:" Yay!)

Как ни странно, если написать это таким образом;

<TestMethod()>
Public Sub TestMethod3()
    Dim client = A.Fake(Of IBroadcastClient)()
    Dim b As New Broadcaster(client)
    b.SendMessageNow()
    A.CallTo(Sub() client.MessageReceivedHandler(A(Of String).Ignored)).MustNotHaveHappened()


End Sub

Также произойдет сбой с тем же сообщением об ошибке, однако эта версия теста пройдена.

<TestMethod()>
Public Sub TestMethod2()
    Dim client = A.Fake(Of IBroadcastClient)()
    Dim b As New Broadcaster(client)
    b.SendMessageNow()
    NextCall.To(client).MustHaveHappened()
    client.MessageReceivedHandler("Yay!")

End Sub

Thisвариация также передается в C #, моя проблема в том, что я делаю неправильно, чтобы получить тест, игнорирующий аргумент, переданный обработчику поддельных событий?

1 Ответ

0 голосов
/ 16 апреля 2011

Синтаксис NextCall существует по старым причинам, лучше использовать синтаксис выражения:

A.CallTo(Sub() client.MessageReceivedHandler(A(Of String).Ignored)).MustNotHaveHappened()

В ваших тестах выше всех остальных есть MustHaveHappened, но в этом конкретном есть MustNotHaveHappened, наверное, поэтомуваш тест не пройденЯ скомпилировал ваш код и запустил его, и как только он был изменен на MustHaveHappened, тест проходит успешно.

В настоящее время вы не можете использовать ограничения аргументов в специфичном для VB синтаксисе NextCall.Однако вы можете использовать метод WhenArgumentsMatch, чтобы переписать ваш первый тест следующим образом:

<TestMethod()>
Public Sub TestMethod1()
    Dim client = A.Fake(Of IBroadcastClient)()
    Dim b As New Broadcaster(client)
    b.SendMessageNow()
    NextCall.To(client).WhenArgumentsMatch(Function(a) a.Get(Of String)(0) = "Yay!").MustHaveHappened()

    client.MessageReceivedHandler(Nothing)
End Sub

Или вы можете использовать расширение «WithAnyArguments», чтобы игнорировать все аргументы:

<TestMethod()>
Public Sub TestMethod1()
    Dim client = A.Fake(Of IBroadcastClient)()
    Dim b As New Broadcaster(client)
    b.SendMessageNow()
    NextCall.To(client).WithAnyArguments().MustHaveHappened()

    client.MessageReceivedHandler(Nothing)
End Sub
...