0

受保護的方法我試圖編寫單元測試代碼如下使用Microsoft.Fakes模擬調用受保護的方法從派生類的公共方法使用Microsoft.fakes

隨着新的和我在嘲笑調用保護的抽象基類功能的方法遇到困難Microsoft.Fakes

我的基類:

public abstract class MyAbstractBaseClass 
{ 
protected virtual int MyFunctionalBaseClassMethod(int parameter1) 
{ 
return (parameter1 * parameter1); 
} 
} 

我的子類:

public class MyChildClass : MyAbstractBaseClass 
{ 
public int GetSquare(int parameter1) //(target method for unit test) 
{ 
return MyFunctionalBaseClassMethod(parameter1); //(target method to mock using Fakes) 
} 
} 

我試過以下單元測試代碼進行嘲弄,但沒有成功:

var square = 10; 
var stubMyAbstractBaseClass = new Fakes.StubMyAbstractBase() 
{ 
MyFunctionalBaseClassMethod = (a) => { return square; } 
}; 

說明:我的抽象基類保護方法執行復雜的操作,所以我需要嘲笑它。上面的代碼只是一個示例。

任何指針,將不勝感激!

+0

如果你的目標是GetSquare()爲什麼你不能這樣做變種X = _myChildClass.GetSquare(2);然後你可以Assert.IsEqual(2,x); – Sasha

+0

如上所述 請注意:我的抽象基類保護方法執行復雜的操作,所以我需要嘲笑它。上面的代碼只是一個示例。 – SRS

回答

2

您需要將MyChildClass而不是抽象類去掉。這對我有效。

[TestMethod] 
public void CheckAbstractClassStub() 
{ 
    var myChild = new StubMyChildClass() 
    { 
     MyFunctionalBaseClassMethodInt32 = (num) => { return 49; } 
    }; 

    int result = myChild.GetSquare(5); 
    Assert.AreEqual(result, 49); 
} 

編輯:是的,它是受保護的。正如我上面提到的那樣,您需要在派生類中保留受保護的方法MyChildClass。你把抽象類剔除了,那裏沒有實例,它不會被調用。如果你想在所有情況下做到這一點,你可以使用Shims,但在這一點上你就會變得更加困難。

這是我的基類和子類,所以你可以比較。

public abstract class MyAbstractBaseClass 
{ 
    protected virtual int MyFunctionalBaseClassMethod(int parameter1) 
    { 
     return (parameter1 * parameter1); 
    } 
} 

public class MyChildClass : MyAbstractBaseClass 
{ 
    public int GetSquare(int parameter1) //(target method for unit test) 
    { 
     return MyFunctionalBaseClassMethod(parameter1); //(target method to mock using Fakes) 
    } 
} 

下面的代碼的屏幕截圖停在調試點

protected method returning stubbed value

+0

'MyFunctionalBaseClassMethodInt32 =(num)=> {return 49; }' 不適用於我的情況,基類方法不公開其保護。 – SRS

相關問題