2011-12-27 5 views
1

저는 System.Security.Cryptography.RandomNumberGenerator를 사용하여 모의하려고합니다. 불행히도 추상 기본 클래스이며 인터페이스가 아닙니다.RhinoMocks 및 추상 기본 클래스

내가 Rhino.Mocks의 기대 설정하려고 : 나는 ABC에서 던진 예외 얻을

int iterations = 10 ; 
byte[] fakeHash = {0, 1, 3, 6}; 
mocks.Get<HashAlgorithm>().Expect(x => x.ComputeHash(Arg<byte[]>.Is.NotNull)) 
    .Return(fakeHash).Repeat.Times(iterations); 

:

시험 방법을 Tests.Utils.FooTest.BarTest 예외가 throw되었습니다. System.ArgumentNullException : 값을 null로 설정할 수 없습니다. 파라미터 명칭 : System.Security.Cryptography.HashAlgorithm.ComputeHash (바이트 [완충액)에서 버퍼

ABC의 인수가 통과 불변 수행된다 널 아니지만 Rhino는 널 (null)을 통과한다. 이는 테스트의 일부로 호출 될 때 설정 (예상/스텁, 이 아님)이 일 때 발생합니다.

어떻게이 문제를 해결할 수 있지만 여전히 메서드가 호출 될 기대와 원하는 가짜 결과를 모두 얻을 수 있습니까? 나는 물론 자신 만의 모의 수업을 할 수는 있지만, 그렇게 할 필요가없는 방법을 찾고 싶다.

감사합니다.

답변

2

ComputeHash이 가상 멤버가 아니기 때문에 예외가 발생합니다. 가상 또는 인터페이스 메소드에서만 예상치를 설정할 수 있습니다. 이 클래스를 조롱하려면 가상 멤버가있는 래퍼를 만들고 실제 클래스 대신 모의 작업을 수행해야합니다.

resharper - 사소한 것이라면 클래스를 만들고 HashAlgorithm을 필드로 넣은 다음 Generate/Delegating Methods를 선택합니다. 모의하고 가상으로 만드는 데 필요한 메소드를 선택하십시오.

0

불행히도 HashAlgorithm.ComputeHash 메소드는 가상이 아니며 RhinoMock에서 조롱 할 수 없습니다.

public byte[] ComputeHash(Stream inputStream) { ... } 
public byte[] ComputeHash(byte[] buffer) { ... } 
public byte[] ComputeHash(byte[] buffer, int offset, int count) 
관련 문제