문제

그래서 나는 다음 수업을 가지고 있습니다.

public class MyClass {
  internal void A() {
    foreach(Thing thing in ThingArray)
      B(thing);
  }

  virtual internal void B(Thing thing)
  {
    //  do some stuff
  }
}

그리고 다음 테스트가 있습니다.

...
var testObject = new Mock<MyClass>(parameters);
testObject.Setup(t => t.B(It.IsAny<Thing>()));

test.Object.A();

test.Verify(t => t.B(It.IsAny<Thing>()), Times.Exactly(2));

그리고 검증이 실패합니다. 확인했고 코드가 호출 중입니다 진짜 B () 조롱 된 b () 메소드와 반대되는 방법.

나는 MOQ가 완벽하게 작동하는 곳에서 많은 코드를 실행하고 있으며, 여기서 잘못하고 있어야한다는 것을 깨닫기에 충분히 코딩 해 왔지만 내 인생에서는 볼 수 없습니다. 나는 테스트에 전화 한 이후로 진행하고 있습니다.물체.a (), b ()에 대한 호출은 모의를 통과하지 못하지만 다른 개체의 전화가 동일하게 작동하기 때문에 실제로는 의미가 없습니다 ...

그렇다면 왜 지구상에서 조롱 된 설정이 실행되지 않습니까?

편집 : 예, 테스트 프로젝트에 내부가 보입니다. 누군가가 그것을 언급 할 것이라는 것을 알았 기 때문에 나는 그것을 원래 게시물에 넣으려고했습니다.

실제 코드에 관해서는 불행히도 매우 독점적이므로 게시 할 수 없습니다. 내일 코드를 조정하여 실제로 컴파일하도록 코드를 조정할 수 있는지 확인하겠습니다.

도움이 되었습니까?

해결책

Gamlor의 답변이 작동하는지 확실하지 않습니다. class1.methoda가 class1.methodb를 호출하는 것을 확인하려는 메소드에서 설정을 수행하려는 경우 (설정을 할 수있는 방법) (InternalSvisibleto에 관계없이) 공개되어야합니다. 비슷한 상황에서 간단한 테스트를 작성했으며 일단 내 방법을 공개적으로 공개하면 MOQ가 작동하기 시작한 것을 발견했습니다. 당신이 당신의 방법 B를 공개한다면, 그것은 효과가있을 것입니다.

나는 이것이 성 또는 Moq 버그라고 생각하지만 확실하지 않습니다. 바라건대 누군가가 차임 할 것입니다.

나는 방법을 공개하는 것이 좋은 선택이 아니라는 것을 알고 있습니다. 그러나 그것이 내가 상황에 대해 알고있는 것입니다 ...

다른 팁

메소드를 성공적으로 조롱하기 위해 모의 가이 기준을 충족해야합니다.

  • 인터페이스 여야합니다
  • 또는 조롱하려는 방법은 가상 방법이자 공개 여야합니다.

이제 가상 내부 방법을 조롱 할 수도 있지만 내부에 MOQ에 액세스 할 수 있도록해야합니다. 이것은 당신이 할 수 있습니다 :

[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]

이로 인해 내부는 MOQ의 코드 제너레이터에 액세스 할 수 있습니다.

그래서 당신을 조롱하기 위해 MyClass.A 전화해야합니다.

  1. 방법을 가상으로 만듭니다.
  2. 그리고 방법을 공개하거나 액세스 할 수 있도록하십시오

    [assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]
    

또는 말했듯이 MyClass의 API를 나타내는 인터페이스를 만듭니다.

MOQ는 기존 코드를 래핑하지 않고 대신 빈 모의를 만듭니다.

즉, TestObject.object.a ()를 호출하면 원래 코드를 실행하지 않으므로 B는 호출되지 않습니다.

인터페이스를 조롱하는 척하면 인터페이스에 코드가 없기 때문에 이는 의미가 있습니다.

이런 모의를 만들어보십시오 (나는 그것을 시도하지 않았으므로 그것이 작동하는지 모르겠습니다) :

var testObject= new Mock<MyClass> { CallBase = true };
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top