IT TIP

객체에 대한 이전 기대치를 지우는 방법은 무엇입니까?

itqueen 2020. 11. 27. 21:52
반응형

객체에 대한 이전 기대치를 지우는 방법은 무엇입니까?


반환 값을 설정하고 싶습니다

_stubRepository.Stub(Contains(null)).IgnoreArguments().Return(true);

그러나 특정 테스트에서 false를 반환하도록 해당 기대를 재정의하십시오.

다음과 같은 것 :

_stubRepository.ClearExpectations();  //<- this does not exist, I'm just making something up
_stubRepository.Stub(Contains(null)).IgnoreArguments().Return(false);

두 번째 호출에서 기대 값이 false를 반환하는 것을 원하지 않으며 첫 번째 기대 값을 무시하고 싶습니다.

이것은 내 테스트 시나리오를 크게 단순화하는 데 도움이됩니다.


세 가지 방법이 있습니다.

BackToRecord를 사용하여 기대치를 재설정 할 수 있습니다.

어색하기 때문에 실제로 사용한 적이 없다는 것을 인정해야합니다.

// clear expectations, an enum defines which
_stubRepository.BackToRecord(BackToRecordOptions.All);
// go to replay again.
_stubRepository.Replay();

편집 : 지금은 가끔 사용하지만 실제로 가장 깨끗한 방법입니다. 그것을 수행하는 확장 방법 (Stub과 같은)이 있어야합니다-방금 잊혀진 것 같습니다. 직접 작성하는 것이 좋습니다.

Repeat.Any ()를 사용할 수 있습니다.

스텁 정의의 순서를 '파괴'하고 이전 정의를 "무시"합니다. 그러나 그것은 어떻게 든 암묵적입니다. 쓰기 쉽기 때문에 가끔 사용합니다.

_stubRepository.Stub(x => x.Contains(null))
  .IgnoreArguments()
  .Return(false)
  .Repeat.Any();

새 모의를 만들 수 있습니다.

사소하지만 명확하고 이해하기 쉽습니다. 많은 정의를 유지하고 하나의 호출 만 변경하려는 경우에만 문제가됩니다.

_stubRepository = MockRepository.GenerateMock<IRepository>();
_stubRepository.Stub(x => x.Contains(null))
  .IgnoreArguments()
  .Return(false);

이러한 상황에서 저는 스텁의 의도를 더 잘 보여주고 가독성을 높이기 위해 간단한 RinoMocks 확장 방법을 만들었습니다.

public static void OverridePrevious<T>(this IMethodOptions<T> options)
{
    options.Repeat.Any();
}

따라서 주석이 필요할 수있는 다음과 같은 암호 호출 대신 :

[SetUp]
public void Setup()
{
    carStub.Stub(x => x.Model).Return("Model1");
    carStub.Stub(x => x.Model).Return("Model2");
}

[Test]
public void SomeTest()
{
    //Arrange
    //overrides previous stubs that were setup for the Model property
    carStub.Stub(x => x.Model).Return(null).Repeat.Any();

    //Act
    //Assert
}

.Repeat.Any () 호출의 의도를 더 잘 보여주는 더 읽기 쉬운 테스트를 얻을 수 있습니다.

carStub.Stub(x => x.Model).Return(null).OverridePrevious();

커뮤니티를 위해 위의 Stefan의 옵션 목록에 추가 할 것입니다.

반환 값을 자주 변경해야하는 경우 다음과 같이 클로저를 사용하는 것이 깨끗하고 효율적입니다.

bool returnValue = true;
_stubRepository.Stub(x => x.Contains(null)).IgnoreArguments().Do(new Func<bool>(() => {
    return returnValue;
}));

returnValue = false;
// Calls to Contains now return false;

returnValue = true;
// Calls to Contains now return true;

The lambda expression will be executed every time Contains is called and because we created a closure referencing returnValue, it will always look up the current value of returnValue.

참고URL : https://stackoverflow.com/questions/770013/how-to-clear-previous-expectations-on-an-object

반응형