2011-12-27 175 views
1

我想模擬使用System.Security.Cryptography.RandomNumberGenerator,不幸是一個抽象的基類,而不是一個接口。RhinoMocks和抽象基類

當我嘗試建立在Rhino.Mocks一種期待:

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); 

我從ABC拋出的異常:

試驗方法 Tests.Utils.FooTest.BarTest 拋出異常:System.ArgumentNullException:值不能爲空。 參數名稱:在 System.Security.Cryptography.HashAlgorithm.ComputeHash(字節[]緩衝液)緩衝液

的ABC被強制執行該傳遞的參數不變不爲空,但犀牛行經空。請注意,這是作爲期望/存根的設置的一部分發生的,而不是當它被稱爲測試的一部分時。

我該如何解決這個問題,但是仍然得到該方法將被調用的期望以及我想要的假結果?當然,我可以製作自己的模擬課程,但我更願意找到一種方法來做到這一點,而不需要這樣做。

謝謝。

回答

2

拋出異常,因爲ComputeHash不是虛擬成員。您只能在虛擬或界面方法上設置期望值。 如果你需要模擬這個類,你需要創建一個包含虛擬成員的包裝,並且模擬它而不是真正的類。

請注意,如果您有一個resharper - 這是微不足道的,只需創建一個類,將HashAlgorithm作爲字段並選擇Generate/Delegating Methods。然後選擇你需要模擬的方法並使它們變爲虛擬:)

0

不幸的是,HashAlgorithm.ComputeHash方法不是虛擬的,不能被RhinoMocks嘲笑。

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