簡體   English   中英

Moq具有內部屬性並實現接口的類

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM