2009-07-27 2 views
1

커스텀 RoleProvider (표준 webforms, mvc 없음)를 생성 했으므로 테스트하고 싶습니다. 공급자 자체는 IIdentity의 사용자 지정 구현과 통합됩니다 (일부 추가 된 속성 포함).Moq 커스텀 IIdentity

나는 순간이 있습니다

var user = new Mock<IPrincipal>(); 
var identity = new Mock<CustomIdentity>(); 

user.Setup(ctx => ctx.Identity).Returns(identity.Object); 
identity.SetupGet(id => id.IsAuthenticated).Returns(true); 
identity.SetupGet(id => id.LoginName).Returns("test"); 

// IsAuthenticated is the implementation of the IIdentity interface and LoginName 

을하지만 내가 VS2008에서이 테스트를 실행할 때 나는 다음과 같은 오류 메시지가 :

비 재정의 구성원

잘못된 설정 : ID => id.IsAuthenticated

왜 이런 일이 발생합니까? 그리고 가장 중요한 것은 그것을 해결하기 위해 무엇을해야합니까?

Grz, Kris.

답변

3

조롱해야하는 변수가 인터페이스에서 선언 된 경우에만 Customidentity 대신 IIdentity를 조롱하거나 사용 된 변수를 가상으로 선언해야합니다.


가 이렇게 같은 가상 표시하려면 다음, 당신의 콘크리트 클래스 CustomIdentity에서

public bool isAuthenticated { get; set; } 

MOQ 및 기타 무료 조롱 프레임 워크의

public virtual bool isAuthenticated { get; set; } 

대신 사용하지 않습니다 가상으로 표시되지 않는 한 구체적인 클래스 유형의 멤버와 메소드를 조롱하게합니다.

마지막으로 직접 mock을 만들 수 있습니다. CustomIdentity를 테스트 클래스에 상속하여 원하는 값을 반환 할 수 있습니다. 예 :

internal class CustomIdentityTestClass : CustomIdentity 
{ 
    public new bool isAuthenticated 
    { 
     get 
     { 
      return true; 
     } 
    } 

    public new string LoginName 
    { 
     get 
     { 
      return "test"; 
     } 
    } 

} 

이 클래스는 CustomIdentity의 모의 테스트 용도로만 사용됩니다.

--edit

의견에 대한 질문에 대한 대답.

+0

사용 변수를 가상으로 선언하면 무엇을 의미합니까? 내 검사 자체를 의미합니까? – XIII

+0

@ XIII 설명을 추가했습니다.설명은 콘크리트 반 –

+0

Thx에서해야합니다. 그러나 사용자 정의 IIdentity 구현 코드에 액세스 할 수는 없습니다. 해결 방법이 있습니까? – XIII

0

인터페이스 IIdentity를 조롱하거나 사용자 정의 유형을 조롱하고 있습니까?

볼 때 더 완전한 코드 조각이 없어도 IsAuthenticated가 사용자 지정 구현에서 가상으로 표시되지 않는다고 불평하는 것으로 추측됩니다. 그러나 이것은 인터페이스가 아닌 구체적인 유형을 조롱하는 경우에만 해당 될 수 있습니다.

+0

저는 실제 클래스와 조롱하고 있습니다. 이것은 어셈블리로 전달 된 다른 팀의 IIdentity를 맞춤 구현 한 것이기 때문입니다. IsAuthenticated 속성은 가상이 아니며 LoginName 속성도 아닙니다. – XIII

+0

ok - 구체적인 클래스에서 IsAuthenticated를 가상으로 표시해야합니다. 이렇게하면 문제가 해결됩니다. –

+0

답글을 읽는 중에 가상으로 표시 할 수있는 옵션이없는 것 같습니다. 이 경우, * 자신의 * wrapper * 클래스를 "unmockable"클래스에 두어 코드에서 사용하는 것을 고려할 수도 있습니다. 그런 다음 래퍼가 mockable인지 확인할 수 있습니다. 며칠 전이 게시물을 참조하십시오 : http://stackoverflow.com/questions/1182338/1182430#1182430 –