Один и тот же Moq SetupSequence используется для разных объектов - PullRequest
0 голосов
/ 19 апреля 2019

Редактировать: Решено

Код на самом деле в порядке.На самом деле оцениваемый метод на самом деле вызывается более одного раза.Но тогда Rhino Mocks Repeat.Once() не показывает правильное поведение ...

Я перехожу из RhinoMocks в Moq и не могу заставить Moq работать должным образом, используя mock.SetupSequence(...).Returns(...).Throws(...).

У меня есть несколько тестов, использующих nUnit TestCaseSource.

В RhinoMocks был некоторый код, который использовал вызов Stub, с Repeat.Once().Это работало нормально.Но теперь я перешел на Moq и сделал SetupSequence, написанное выше.Каждый раз при создании метода SetUp создается новый объект, но я получаю исключение.

TestCaseSource:

public static IEnumerable<TestCaseData> SettingsTestCases
{
    get
    {
        // Null Settings
        yield return new TestCaseData(null);

        // Null Acquisition
        yield return new TestCaseData(new Settings(null, new Optics()));

        // Null Optics
        yield return new TestCaseData(new Settings(new Acquisition(), null));
    }
}

SetUp:

private Mock<ISample> foo;

[SetUp]
public void SetUp()
{
    foo = new Mock<IFoo>();
}

Тест:

[Test, TestCaseSource(nameof(SettingsTestCases))]
public void PerformTest(Settings settings)
{
    //THESE RHINO MOCKS LINES WORKS
    //foo.Stub(x => x.GetSettings(ExperimentId.)).Return(settings);
    //foo.Expect(x => x.Carrier).Return("Type1").Repeat.Once();

    //IN MOQ, ALWAYS GET THE EXCEPTION
    foo.Setup(x => x.GetSettings(Experiment.Id)).Returns(settings);
    foo.SetupSequence(x => x.Carrier)
        .Returns("Type1")
        .Throws(new Exception("Called too many times"));
    { do asserts here }
}

Я заметил, что перед каждым запуском теста (3 раза из-за TestCaseSource) он всегда нажимает SetUp и создает новый экземпляр Mock<IFoo>.Итак, для каждого теста у нас каждый раз появляется новый foo, но в итоге кажется, что вызовы SetupSequence распределяются между 3 экземплярами, потому что у меня есть исключение , но я уверен, чтоон вызывается только один раз для каждого теста. Rhino Mocks Repeat.Once() работает хорошо и, похоже, ссылается только на один конкретный экземпляр.

Могу ли я написать код другим способом, чтобы получить тот же ответ, что и старый код (Rhino Mocks)?

1 Ответ

0 голосов
/ 19 апреля 2019

Я нашел ошибку. На самом деле во время части assert кто-то делал другие вызовы для метода GetSettings, так что это, очевидно, приводило бы к ошибкам, если ожидался только один вызов. (Так что я был уверен, что что-то не так. Позор мне!)

Логика заключается в следующем: первый вызов должен возвращать «Type1», а остальные должны возвращать что-то еще.

Это поднимает другой вопрос: Rhino Mocks Repeat.Once() терпел неудачу, тогда? Это проходит даже с более чем одним вызовом.

...