第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在 NSubstitute 3.1 中使用 ref 參數(shù)引發(fā)委托事件?

如何在 NSubstitute 3.1 中使用 ref 參數(shù)引發(fā)委托事件?

C#
湖上湖 2023-09-09 16:18:38
我正在開發(fā)一個使用第三方庫的 C# 項(xiàng)目。該庫使用 ref 參數(shù)定義了一個相當(dāng)不尋常的委托事件:event GetDataHandler OnGetData;public delegate bool GetDataHandler(string name, ref byte[] data);我試圖通過 NSubstitute (版本 3.1)在單元測試中引發(fā)此事件,但我無法讓它工作。我嘗試了這段代碼(基本上是我能想到的所有變體):var theKey = "test";byte[] theData = null;_theObject.OnGetData += Raise.Event<GetDataHandler>(theKey, ref theData);但這不能編譯。編譯器說:參數(shù) 2 不能與 'ref' 關(guān)鍵字一起傳遞。我知道 NSubstitute 4.x 中的 out/ref 機(jī)制已發(fā)生變化,但我的公司尚未升級到較新的版本。有什么方法可以使用 NSubstitute 3.1 啟動并運(yùn)行它嗎?多謝!最好的問候,奧利弗
查看完整描述

1 回答

?
烙印99

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)容的更多信息,我很樂意嘗試提出更合理的答案。:)


查看完整回答
反對 回復(fù) 2023-09-09
  • 1 回答
  • 0 關(guān)注
  • 105 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號