Как я могу утверждать, что метод вызывался на этой ложной зависимости с помощью moq и mspec? - PullRequest
0 голосов
/ 10 ноября 2011

Я тестировал репозиторий моделей, чтобы посмотреть, вызывает ли он шину сообщений. Я не уверен, что это хороший тест, но вот мое мнение: я обычно помещаю bus.send в контроллер (это веб-приложение MVC), но так как я не хочу тестировать свои контроллеры специально для логика, я перенес это в хранилище. Контроллеры просты в моем случае. Хранилище использует шину и базу данных моделей для построения моделей представлений.

В любом случае, проблема в том, что я запускаю тест moq. Я издевался над шиной и хотел убедиться, что она вызывается из хранилища.

Тест выглядит так:

public class when_creating_new_clinic
{
    Establish context = () =>
    {
        clinicID = Guid.NewGuid();
        model = new ClinicModel
        {
            ClinicID = clinicID,
            Alias = "alias",
            Title = "title"
            // stuff omitted
        };
        newClinicData = new NewClinicData
        {
            ClinicID = clinicID,
            Alias = "alias",
            Title = "title"
            // stuff omitted 
        };
        cmd = new CreateClinicCmd(newClinicData);
        bus = new Mock<IMessageBusAgent>();
        repository = new ClinicModelRepository(bus.Object);

        bus.Setup(b => b.Send(cmd));
    };

    Because it = () => repository.Create(model);

    It should_send_create_clinic_command_to_bus = () =>
    {
        bus.Verify(b => b.Send(cmd), Times.Exactly(1));
    };

    static ClinicModelRepository repository;
    static ClinicModel model;
    static Mock<IMessageBusAgent> bus;
    static NewClinicData newClinicData;
    static Guid clinicID;
    static CreateClinicCmd cmd;
}

Суть хранилища такова:

public class ClinicModelRepository : IClinicModelRepository
{
    private readonly IMessageBusAgent m_bus;

    public ClinicModelRepository(IMessageBusAgent bus)
        : this()
    {
        m_bus = bus;
    }

    public void Create(ClinicModel clinicModel)
    {
        // stuff omitted (data is mapped from clinicModel)          

        m_bus.Send(new CreateClinicCmd(data));
    }
}

IMessageBusAgent объявлен как:

public interface IMessageBusAgent : IDomainCommandSender, IDomainEventPublisher, IUnitOfWork
{
}

Результат теста выглядит следующим образом:

when creating new clinic

»следует отправить команду создания клиники на автобус (FAIL)

Тест «должен отправить команду создания клиники на шину» не пройден: Moq.MockException: Ожидаемый вызов на макет ровно 1 раз, но был 0 раз: b => b.Send (when_creating_new_clinic.cmd)

Configured setups:
b => b.Send<CreateClinicCmd>(when_creating_new_clinic.cmd), Times.Never

Performed invocations:
IDomainCommandSender.Send(ArReg.Commands.CreateClinicCmd)
IUnitOfWork.Commit()
at Moq.Mock.ThrowVerifyException(MethodCall expected, IEnumerable`1 setups, IEnumerable`1 actualCalls, Expression expression, Times times, Int32 callCount)
at Moq.Mock.VerifyCalls(Interceptor targetInterceptor, MethodCall expected, Expression expression, Times times)
at Moq.Mock.Verify[T](Mock mock, Expression`1 expression, Times times, String failMessage)
at Moq.Mock`1.Verify(Expression`1 expression, Times times)
Repositories\when_creating_new_clinic.cs(51,0): at ArReg.Tests.Specs.Repositories.when_creating_new_clinic.<.ctor>b__4()
at Machine.Specifications.Model.Specification.InvokeSpecificationField()
at Machine.Specifications.Model.Specification.Verify()

0 пройдено, 1 не выполнено, 0 пропущено, заняло 3,58 секунды (Machine.Specifications 0.4.24-f7fb6b5).

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

Спасибо

1 Ответ

3 голосов
/ 14 ноября 2011

В вашей настройке bus-moq есть небольшая ошибка. Должно быть так:

bus.Setup(b => b.Send(It.IsAny<CreateClinicCmd>()));

Причина: вы написали вашу установку с экземпляром CreateClinicCmd, созданным двумя строками кода выше. В тестируемом классе ClinicModelRepository вы создаете еще один экземпляр этого класса и называете его шиной. Этот вызов не соответствует вызову, который вы написали в вашей настройке.

...