因為目前專案時間比較緊(乙個月的開發周期),並且,工作流的測試步驟也比較多,所以,我決定採用一種模擬物件測試技術:mock。mock可以為介面生成模擬物件,從而在我們寫實現**之前就檢查其邏輯和互動行為是否正確。我們選用的mock框架是moq 3,基於lambda語法的一款非常簡單的mock框架。
1iemployee.cs
2namespace
thoth.featureproject37
string
name
8int
age 9}
10}1iseat.cs
2namespace
thoth.featureproject38
}1maintest.cs23
using
moq;
4using
nunit.framework;
5using
thoth.featureproject;67
namespace
thoth.moqproject836
}37}38
上面的測試全部通過。1//
建立乙個mock物件(泛型)
2var employee
=new
mock
<
iemployee
>
();34//
為此mock物件的乙個屬性(這行是針對identifier)值(setupget是為介面的property設定值,值在return()方法中)
5employee.setupget(p
=>
p.identifier).returns(1);
67//取出mock物件的值,檢查是否正確
8assert.areequal(
"justina chen
", employee.object.name);910
//為mock物件的方法設定乙個引數及返回物件(setup針對的是方法),returns是返回物件,get(1)中值為1的引數
11seat.setup(p
=>
p.get(
1)).returns(employee.object);
1213
//這兩行檢查我們返回結果是否正確
14var seatreturned
=seat.object.get(1);
15assert.areequal(
"justina chen
", seatreturned.name);
1617
//這行是指任何int引數都返回此物件
18seat.setup(p
=>
p.get(it.isany
<
int>
())).returns(employee.object);
1920
//這裡指定了乙個篩選條件
21seat.setup(p
=>
p.get(it.is
<
int>
(id
=>
id >0&&
id <
6))).returns(employee.object);1//
那麼,下面的測試結果是?
2var seatiii
=new
mock
<
iseat
>
();3
seatiii.setup(p
=>
p.get(
1)).returns(employee.object);
4var seatobject
=seatiii.object.get(0);
5assert.areequal(
"justina chen
", seatobject.name);
seatobject.name將報出nullrefenrenceexception,因為我們setup的是1,而希望獲取的物件是0,所以,檢索為空 :-)
我們專案中目前運用到的mock技術差不多就是這樣了,希望能減輕大家跑流程的步驟 :-d 隨著使用的深入,會繼續與大家分享。
模擬物件(一)
互動測試用來測試乙個物件如何向另乙個物件傳遞訊息,或者如何從其他物件接收訊息,即測試物件如何與其他物件進行互動。模擬物件是系統中的乙個偽物件,用來決定乙個單元測試是通過還是失敗。它通過驗證被測物件和偽物件之間是否進行預期的互動來判斷。通常每個測試只有乙個偽物件。樁物件和模擬物件的區別 使用樁物件時,...
模擬物件(二)
本文演示同時使用樁物件和模擬物件。當檔名太短時,loganalyzer傳送錯誤訊息給web伺服器。web伺服器出錯時,傳送郵件給管理員。有上述業務可知,loganalyzer有兩個外部依賴 web服務和郵件服務。現在測試loganalyzer在web服務丟擲異常時正確呼叫了郵件服務。樁物件 使web...
Mock測試技術
在軟體測試過程中,對於一些不容易構造 獲取的物件,用乙個虛擬的物件來替代它,以達到相同的效果,這個虛擬的物件就是mock。在前後端分離專案中,當後端工程師還沒有完成介面開發的時候,前端開發工程師利用mock技術,自己用mock技術先呼叫乙個虛擬的介面,模擬介面返回的資料,來完成前端頁面的開發。其實,...