這是我的問題:如何在這種情況下使用模擬?
我有一個n層應用程序,我必須編寫單元測試。單元測試是針對業務層的。
我有一個測試方法叫做Insert()
,這個方法使用了兩個繼承的受保護方法,並直接從數據訪問層調用一個方法。
所以我做了一個模擬對象的DAL。但這裏有一點,在(編輯:)保護方法從繼承,它將使用DAL中的另一個對象!看來這是不可能的嘲笑這一個!
下面是測試代碼的方法:
public int Insert(MYOBJECT aMyObject)
{
//first inherited method use the FIRSTDALOBJECT so the mock object --> No problem
aMyObject.SomeField= FirstInherited();
//Second inherited method (see after) --> my problem
aMyObject.SomeOtherField = SecondInherited();
// Direct access to DALMethod, use FIRSTDALOBJECT so the mock -->No Problem
return this.FIRSTDALOBJECT.Insert(aMyObject);
}
這裏是SecondInherited方法:
protected string SecondInherited()
{
// Here is my problem, the mock here seems not be possible for seconddalobject
return (new SECONDDALOBJECT Sdo().Stuff());
}
這裏是單元測試方法代碼:
[TestMethod()]
public void InsertTest()
{
BLLCLASS_Accessor target = new BLLCLASS_Accessor();
MYOBJECT aMyObject = new MYOBJECT { SomeField = null, SomeOtherField = 1 };
int expected = 1;
int actual;
//mock
var Mock = new Mock<DAL.INTERFACES.IFIRSTDALOBJECT>();
//Rec for calls
List<SOMECLASS> retour = new List<SOMECLASS>();
retour.Add(new SOMECLASS());
//Here is the second call (last from method to test)
Mock
.Setup(p => p.Insert(aMyObject))
.Returns(1);
// Here is the first call (from the FirstInherited())
Mock
.Setup(p => p.GetLast())
.Returns(50);
// Replace the real by the mock
target.demande_provider = Mock.Object;
actual = target.Insert(aMyObject);
Assert.AreEqual(/*Some assertion stuff*/);
}
謝謝閱讀所有的問題:-)希望它是清楚的。
它受到保護,對我的錯誤感到抱歉。 – bAN 2011-03-31 09:09:12
+1:快速結果的良好解決方案 – 2011-03-31 09:09:35
@bAN,感謝您的澄清,這種解決方案更容易。 – 2011-03-31 09:13:37