1 回答

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超13個贊
該Raise.Event重載將參數(shù)作為params object[]. 我們可以將 byref 字節(jié)數(shù)組作為此 params 數(shù)組中的標(biāo)準(zhǔn)值傳遞(這意味著我們傳遞的事件參數(shù)無法獲得編譯時安全性,但如果我們弄錯了,測試會很快發(fā)現(xiàn)它) :) ):
_theObject.OnGetData += Raise.Event<GetDataHandler>("name", theData);
這是一個可執(zhí)行的示例:
using NSubstitute;
using Xunit;
public delegate bool GetDataHandler(string name, ref byte[] data);
public interface ISomeType {
? ? event GetDataHandler OnGetData;
}
public class SampleFixture {
? ? string lastNameUsed = "";
? ? byte[] lastBytesUsed = new byte[0];
? ? [Fact]
? ? public void SomeTest() {
? ? ? ? var sub = Substitute.For<ISomeType>();
? ? ? ? var data = new byte[] { 0x42 };? ? ? ? ? ?
? ? ? ? sub.OnGetData += Sub_OnGetData;
? ? ? ? sub.OnGetData += Raise.Event<GetDataHandler>("name", data);
? ? ? ? Assert.Equal("name", lastNameUsed);
? ? ? ? Assert.Equal(data, lastBytesUsed);
? ? }
? ? private bool Sub_OnGetData(string name, ref byte[] data) {
? ? ? ? lastNameUsed = name;
? ? ? ? lastBytesUsed = data;
? ? ? ? return true;
? ? }
}
我認(rèn)為 NSubstitute 不支持檢查在這種情況下返回的值。
在不確切知道您要測試什么的情況下,我可以建議一些測試此類事情的通用方法。
ISomeType第一個選擇是手動編寫您可以完全控制的測試替身(在本例中是 的實(shí)現(xiàn))。除非接口很大,否則我會推薦這種方法。
另一種選擇是分別測試委托和接線。例如,給定這個類:
public class ClassUnderTest {
? ? public ClassUnderTest(ISomeType dep) {
? ? ? ? dep.OnGetData += Dep_OnGetData;
? ? }
? ? public static bool Dep_OnGetData(string name, ref byte[] data) {
? ? ? ? data = System.Text.Encoding.UTF8.GetBytes(name);
? ? ? ? return true;
? ? }
}
我們可以獨(dú)立測試委托,然后測試我們是否已連接該委托:
[Fact]
public void TestDelegate() {
? ? byte[] data = new byte[0];
? ? var result = ClassUnderTest.Dep_OnGetData("hi", ref data);
? ? Assert.True(result);
? ? Assert.Equal(new byte[] { 104, 105 }, data);
}
[Fact]
public void TestWireup() {
? ? var sub = Substitute.For<ISomeType>();
? ? var subject = new ClassUnderTest(sub);
? ? sub.Received().OnGetData += ClassUnderTest.Dep_OnGetData;
}
我認(rèn)為這種情況下的委托測試可能非常有用,但接線測試可能不是很好,因?yàn)樗浅L囟ㄓ谔囟ǖ膶?shí)現(xiàn),而不是所需的行為/結(jié)果。但在這種情況下觀察特定效果很困難,因此這是一個潛在的答案。
第三,我們也許能夠在相關(guān)庫上使用更可測試的包裝器。或者這個測試可能完全處于錯誤的級別——警惕我們不擁有的模擬類型。(我在這里寫了一些相關(guān)內(nèi)容。)
如果您可以提供有關(guān)您在這種情況下嘗試測試的內(nèi)容的更多信息,我很樂意嘗試提出更合理的答案。:)
- 1 回答
- 0 關(guān)注
- 105 瀏覽
添加回答
舉報(bào)