У меня есть эта проблема, которая может быть ошибкой в Насмешках Носорога 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
, действительно ли это - корректное поведение?
Если вы хотите вернуть пустой гид заданное количество раз, единственное, что вам нужно сделать, это указать 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 () и закодировать его там (сообщите мне, если вам нужно подробнее).
Следующие тесты должны пройти:
// 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);
Вы только что запрограммировали объект-заглушку для двух отдельных вызовов. Если вы снова вызовете stubObj.Get, вы должны получить то, что сгенерировано Guid.NewGuid
. Вы можете подготовить свой фальшивый объект к любому количеству вызовов разного рода. По этой причине не имеет смысла ожидать, что последний вызов .Stub
для данного вызова заменит предыдущие бинги .Stub
этого вызова.
В вашем тестовом коде, который должен быть коротким и аккуратным, никогда не должно быть случая, когда вам нужно «отменить» такое программирование макета так, как вам кажется.
Если то, что нужно вернуть, является условным, которое меняется в зависимости от других битов вашего тестового кода при нескольких вызовах этого блока кода, последнее, что вам нужно, - это волшебство, заставляющее читателей понять, что вы имели в виду. . Если это условно, вы должны прояснить это.
А затем, когда вы все проясните, проведите рефакторинг, так как у вас не должно быть условной логики в тестах (см. Тестовые шаблоны xUnit)
Вот как это можно сделать. На моей машине это проходит.
[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();
}