[英]Moq a class that has an internal property and which implements an interface
所以我有一個既實現接口又具有內部屬性的類。 我需要使用Moq來模擬這兩種方法以測試方法。
public interface IMyObject
{
bool myMethod (String input);
}
public class MyObject : IMyObject
{
public bool myMethod(String input) {...}
internal bool myProperty {get;}
}
現在,我可以使用Moq進行模擬。
myMethod:
var myIObjectMock = mockRepository.Create<IMyObject>();
myIObjectMock.Setup(m => m.myMehtod(It.IsAny<String>())).Returns((String input) => {...});
我的財產:
var myObjectMock = mockRepository.Create<MyObject>();
myObjectMock.SetupGet(m => m.myProperty).Returns(...);
我的問題是,我如何同時嘲笑兩者?
問題的核心似乎是我在第一種情況下模擬了一個接口,在第二種情況下模擬了一個類。 因此,我看到的解決方案是使其實現,以便您可以通過模擬類或接口來模擬屬性和方法。 這意味着要么將內部屬性轉換為公共屬性,然后將其作為接口的一部分,要么使該方法成為虛擬方法。
是否有不涉及更改MyObject類的解決方案?
我認為內部屬性不在接口上有點警告,因為似乎您在等待類的某些副作用來設置它,這可能導致爭用條件。 一般而言,應保持屬性不變,以避免此類困難。
您提到了解決此問題的僅有的兩種方法。 最少的干擾是使該方法虛擬化。 添加另一個字段的另一種選擇也不是那么危險。 我只是做這些更改之一並完成它。 您唯一能做的就是嘗試通過接口在此類上混合使用擴展方法,我強烈建議您避免使用。
第一個警告是,如果您的類定義和單元測試位於不同的程序集中,並且可能存在,則首先必須添加
[assembly: InternalsVisibleTo("<test project name>")]
到要測試的程序集的AssemblyInfo.cs文件中以獲取內部屬性,甚至可以顯示到單元測試程序集。
至於Moq需要兩個單獨的對象,您可能不需要。 從上面使用您的示例
var mock = new Mock<MyObject>();
mock.As<IMyObject>().Setup(m => m.myMethod(It.IsAny<string>())).Returns(...);
mock.SetupGet(m => m.myProperty).Returns(...);
不幸的是,該設置將引發NotSupportedException
因為myProperty
不是虛擬的,並且Moq不支持模擬非虛擬成員。 您將必須針對該類型的功能查看其他模擬庫。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.