Я могу получить серию хороших результатов и вызванной исключительной ситуации от Moq

Вы можете разделить на «@» и просто использовать первую часть.

email.split("@")[0]

Это даст вам первую часть перед «@».

6
задан BlackWasp 12 June 2009 в 09:11
поделиться

1 ответ

Ага, это возможно, если вы не против прыгнуть через несколько мелких обручей. Я делал это раньше для одного из своих проектов. Хорошо, вот основная техника. Я только что протестировал это в Visual Studio 2008, и это работает:

var mockMessage1 = new Mock<IMessage>();
var mockMessage2 = new Mock<IMessage>();
var mockMessage3 = new Mock<IMessage>();

var messageQueue = new Queue<IMessage>(new [] { mockMessage1.Object, mockMessage2.Object, mockMessage3.Object });

var mockMsmqWrapper = new Mock<IMsmqWrapper>();

mockMsmqWrapper.Setup(x => x.GetMessage()).Returns(() => messageQueue.Dequeue()).Callback(() =>
{
    if (messageQueue.Count == 0)
        mockMsmqWrapper.Setup(x => x.GetMessage()).Throws<MyCustomException>();
});

Несколько примечаний:

  1. Вам не нужно возвращать фиктивные сообщения, но это полезно, если вы хотите проверить ожидания по каждому сообщению, чтобы увидеть если были вызваны определенные методы или заданы свойства.
  2. Идея очереди не моя, это просто совет, который я получил из сообщения в блоге.
  3. Я генерирую исключение MyCustomException, потому что класс Queue автоматически выбрасывает InvalidOperationException. Я хотел удостовериться, что имитируемый объект MsmqWrapper генерирует исключение из-за Moq, а не из-за того, что в очереди заканчиваются элементы.

Здесь ' s полный код, который работает. Имейте в виду, что этот код в некоторых местах уродлив, но я просто хотел показать вам, как это можно проверить:

public interface IMsmqWrapper
{
    IMessage GetMessage();
}

public class MsmqWrapper : IMsmqWrapper
{
    public IMessage GetMessage()
    {
        throw new NotImplementedException();
    }
}

public class Processor
{
    private IMsmqWrapper _wrapper;
    public int MessagesProcessed { get; set; }
    public bool ExceptionThrown { get; set; }

    public Processor(IMsmqWrapper msmqWrapper)
    {
        _wrapper = msmqWrapper;        
    }

    public virtual void ProcessMessages()
    {
        _wrapper.GetMessage();
        MessagesProcessed++;
        _wrapper.GetMessage();
        MessagesProcessed++;
        _wrapper.GetMessage();
        MessagesProcessed++;

        try
        {
            _wrapper.GetMessage();
        }
        catch (MyCustomException)
        {
            ExceptionThrown = true;
        }
    }
}

[Test]
public void TestMessageQueueGetsExhausted()
{
    var mockMessage1 = new Mock<IMessage>();
    var mockMessage2 = new Mock<IMessage>();
    var mockMessage3 = new Mock<IMessage>();

    var messageQueue = new Queue<IMessage>(new [] { mockMessage1.Object, mockMessage2.Object, mockMessage3.Object });

    var mockMsmqWrapper = new Mock<IMsmqWrapper>();
    mockMsmqWrapper.Setup(x => x.GetMessage()).Returns(() => messageQueue.Dequeue()).Callback(() =>
    {
        if (messageQueue.Count == 0)
            mockMsmqWrapper.Setup(x => x.GetMessage()).Throws<InvalidProgramException>();
    });

    var processor = new Processor(mockMsmqWrapper.Object);

    processor.ProcessMessages();

    Assert.That(processor.MessagesProcessed, Is.EqualTo(3));
    Assert.That(processor.ExceptionThrown, Is.EqualTo(true));
}
5
ответ дан 17 December 2019 в 04:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: