2011-12-22 2 views
0

필자가 아는 한, 스텁은 의존성을 대신 할뿐입니다. 스텁은 검증에 사용되지 않으며 테스트에서 실패 할 수 없습니다. The Unit Of Testing이라는 책에서.스텁에서 AssertWasCalled 메서드를 호출 할 수 있다면 모의 (mock)와 스텁 (stub)의 차이점은 무엇입니까?

그러나 코뿔소 모의 객체 3.5 나는이 할 수 있기 때문에 보인다 : 나는 스텁을 사용해야 할 경우 방법이 스텁 호출되는지 여부를 확인할 수있는 경우

var service = MockRepository.GenerateStub<ILuckyService>(); 
service.AssertWasCalled(s=>s.GetLuckyNumberOfTheDay()); 

은 왜 나 자신을 귀찮게해야합니까 아니면 모의?

+0

깨끗한 코드 때문에? – Grrbrr404

+0

아마도 그들은 동일합니다.이 질문 참조 : http://stackoverflow.com/questions/477924/rhino-mocks-stub-expect-vs-assertwascalled 그리고이 Ayende의 게시물 : http : // ayende.com/blog/3384/rhino-mocks-3-5-design-decisions-the-role-of-stub-vs-mock –

+0

FakeItEasy 및 NS substitute와 같은 다른 조롱 프레임 워크는 단 하나의 가짜/가짜/스텁을 사용합니다. 결국 일반적으로 단위 테스트에서 뭔가를 위장하려고하고 용어의 차이점에 신경 쓰지 않습니다. –

답변

3

Martin Fowler의 기사를 팀 내의 공유 참조로 사용하십시오. 이 구분은 독자들에게 중요합니다. 스텁을 볼 때 무시하고 계속 진행합니다.

  • 스텁은 테스트 작업을 수행하기위한 것입니다 (NOP 메소드/반환 된 일부 값). 시험의 초점이 아니라 부수적 인 세부 사항입니다. (테스트 시나리오의 필수 세부 사항/종속성 임에도 불구하고)
  • 다른 한편으로는 모의 (mock)이 주된 관심사입니다 ... 귀하의 행동이 (mocked) 의존성에서 특정 기대치를 충족시키는 지 여부를 테스트하려고합니다.

그건 제 의견입니다. Rhino Mock에서이 작업을 수행 할 수 있다고하더라도 스텁에서 주장하지 않습니다.

+0

동의합니다. 그러나 우리는이 경우 STUBS과 함께 MOCK 객체로 할 수있는 anyhting을 할 수 있습니까? 또는 하나는 다른 것에 비해 몇 가지 제한이 있습니까? – pencilCake

+1

방금 ​​읽었으며 명확한 구별이없는 것으로 보입니다. docs에서 말하는 내용은 다음과 같습니다. http://ayende.com/wiki/Rhino%20Mocks%203.5.ashx#stifsandmocks 사이의 차이점 Stubs 사용을 권장합니다. 또한 Expect() - Do() - Verify() 및 AssertWasCalled는 같은 일을하는 두 가지 방법 인 것 같습니다. Rhino Mock으로 이동할 때 링크에서 밑줄 친 부분을 읽어보십시오. 평결 : 너무 복잡합니다. – Gishu

+1

100 %는 "너무 복잡합니다"에 동의했습니다. 내가 테스트를 쓸 때 내가 원하는 것은 테스트가 실제로 그것이하는 것이라고 생각하는지 궁금해하는 것입니다. 스텁과 모의의 정의에 충실하거나 프레임 워크에서 이러한 구분을 전혀 사용하지 마십시오. – Mathias

0

참조 파울러 :

+0

Martin의 분류는 RhinoMocks의 모의 및 스텁 해석에 잘 적용되지 않습니다. RM에서는 차이가 훨씬 덜 분명합니다. –

1

http://martinfowler.com/articles/mocksArentStubs.html 사실 RhionMocks의 모의와 스텁 클래스의 동작은 동일하며, even to the creator of RhinoMocks을 혼동 될 수 있습니다.
그러나 stub and mock 사이에는 근본적인 차이점이 있으므로 Rhino Mocks로 하나를 선택하면 코드 의도가 명확 해집니다.
스텁을 만들 때 스텁의 메서드 호출 (예 : 일부 Log 객체를 사용할 때)에서 테스트가 실패하는 것을 원하지 않습니다.
Mock을 만들 때 코드가 제공된 객체를 예상 한대로 사용했는지 확인해야합니다 (예 : 올바른 데이터를 데이터베이스에 쓰는 것).

+0

메소드를 호출했는지 확인하기 위해 Stubs + AssertWasCalled()를 사용하고 Verify() 메소드가 더 나은 접근 방법이라고 생각합니다. 최소한 Arrange/Act/Assert 형태로 테스트를 유지하기 때문입니다. –

0

스텁 또는 모의는 개념입니다. 스텁을 만들어 모의 (mock)로 사용할 수도 있고 반대로 스텁을 모의 (mock)로 사용할 수도 있습니다. 이 기사를 읽는 것이 좋습니다. - http://martinfowler.com/articles/mocksArentStubs.html

1

항상 스텁을 사용하려고합니다. 스텁과 모의 (RM 관점에서)의 차이는 스텁이 결코 호출 중에 예외를 throw하지 않는다는 것입니다. Mock (특히 엄격한 것)은 예상보다 다른 인수를 사용하여 호출하는 경우 즉시 처리합니다. 또한 스텁이 아닌 mock에서만 기대를 확인할 수 있습니다.

또 다른 딜레마는 무엇을 사용해야합니까 : Expect.Call() 또는 SetupResult.For() (후자를 사용하는 경향이 있습니다). 그러나 나는 그 모든 풍요 로움이 대부분의 시나리오에서 쓸모 없다는데 동의합니다. 그것이 내가 스텁을 선호하는 이유입니다.

그러나 나는 Nsubstitute을 살펴볼 것을 권장합니다. 모든 엉망이없고 아주 표현적인 구문이 있습니다. 몇 가지 예를 살펴보면 곧바로 그것을 좋아하게 될 것입니다.

+0

정확한 것은 아닙니다. AssertWasCalled를 호출하여 스텁을 검증 할 수 있습니다. 엄격하지 않은 모의는 스텁과 마찬가지로 호출이 예상되지 않으면 예외를 throw하지 않습니다. –

관련 문제