Насмешки носорога, перезаписывающие возможные тупики?

У меня есть эта проблема, которая может быть ошибкой в Насмешках Носорога 3.5:

stubObj = MockRepository.GenerateStub(IObject);

stubObj.Stub(a=>a.Get()).Return (Guid.Empty); //1.stub
stubObj.Stub(a=>a.Get()).Return (Guid.NewGuid()); //2.stub, should overwrite the first one?

это:

var value = stubObj.Get(); 

возвраты Guid.Empty, действительно ли это - корректное поведение?

10
задан razlebe 24 November 2011 в 13:29
поделиться

4 ответа

Если вы хотите вернуть пустой гид заданное количество раз, единственное, что вам нужно сделать, это указать RhinoMocks, сколько раз его повторять, например следующие тесты проходят:

[Test]
    public void MultipleStubsTest()
    {
        var testMock = MockRepository.GenerateMock<ITest>();
        testMock.Stub(x => x.Get()).Return(Guid.Empty).Repeat.Once();
        testMock.Stub(x => x.Get()).Return(Guid.NewGuid());

        Assert.AreEqual(Guid.Empty, testMock.Get());
        Assert.AreNotEqual(Guid.Empty, testMock.Get());
    }

если вы не знаете, сколько раз будет вызываться Get () до изменения guid, вы всегда можете использовать .Do () и закодировать его там (сообщите мне, если вам нужно подробнее).

8
ответ дан 4 December 2019 в 01:56
поделиться

Следующие тесты должны пройти:

// arrange
var stubObj = MockRepository.GenerateStub<IObject>();
stubObj.Stub(a => a.Get())
       .Return(Guid.Empty);
// act
var value = stubObj.Get();
// assert
Assert.AreEqual(Guid.Empty, value);

А если вы хотите вернуть новый guid:

// arrange
var stubObj = MockRepository.GenerateStub<IObject>();
stubObj.Stub(a => a.Get())
       .Return(Guid.NewGuid());
// act
var value = stubObj.Get();
// assert
Assert.AreNotEqual(Guid.Empty, value);
0
ответ дан 4 December 2019 в 01:56
поделиться

Вы только что запрограммировали объект-заглушку для двух отдельных вызовов. Если вы снова вызовете stubObj.Get, вы должны получить то, что сгенерировано Guid.NewGuid . Вы можете подготовить свой фальшивый объект к любому количеству вызовов разного рода. По этой причине не имеет смысла ожидать, что последний вызов .Stub для данного вызова заменит предыдущие бинги .Stub этого вызова.

В вашем тестовом коде, который должен быть коротким и аккуратным, никогда не должно быть случая, когда вам нужно «отменить» такое программирование макета так, как вам кажется.

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

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

1
ответ дан 4 December 2019 в 01:56
поделиться

Вот как это можно сделать. На моей машине это проходит.

    [TestMethod]
    public void Test()
    {
        stubObj = MockRepository.GenerateMock<IGuidTest>();

        stubObj.Stub(a => a.Get()).Repeat.Times(1).Return(Guid.Empty);
        stubObj.Stub(a => a.Get()).Repeat.Times(1).Return(Guid.NewGuid()); 

        Assert.AreEqual(Guid.Empty, stubObj.Get());
        Assert.AreNotEqual(Guid.Empty, stubObj.Get());

    }
    public IGuidTest stubObj;
    public interface IGuidTest
    {
        Guid Get();
    }
1
ответ дан 4 December 2019 в 01:56
поделиться
Другие вопросы по тегам:

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