2011-10-26 25 views
6

私はSearchResultCollectionクラスを模擬しようとしています。私はPropertiesLoadedゲッターへの呼び出しをインターセプトしようとすると、しかし、私のテストは、例外がスローされます。Moq C#組み込みクラス

System.NotSupportedException: Invalid setup on a non-virtual (overridable in VB) member: x => x.PropertiesLoaded 

マイコード:

Mock<SearchResultCollection> searchResultMock = new Mock<SearchResultCollection>(); 

// Set up collection that will be returned 
string[] tempData = { "one", "two" }; 
searchResultMock.SetupGet(x => x.PropertiesLoaded).Returns(tempData); 

は誰が正常にこのようなクラスを嘲笑していますか?問題のプロパティはゲッターを持ち、仮想ではありません。

// 
    // Summary: 
    //  Gets the System.DirectoryServices.DirectorySearcher properties that were 
    //  specified before the search was executed. 
    // 
    // Returns: 
    //  An array of type System.String that contains the properties that were specified 
    //  in the System.DirectoryServices.DirectorySearcher.PropertiesToLoad property 
    //  collection before the search was executed. 
    public string[] PropertiesLoaded { get; } 
+0

可能複製([?私は部品番号とMouseButtonEventArgs.GetPositionを()モックができないのはなぜ] http://stackoverflow.com/questions/1918208/why-cant-i-mock-mousebuttoneventargs-getposition-with-moq) – TrueWill

答えて

8

私は恐れることはできません。

あなたはプロパティが仮想ではないと言いました。別のオプションは、インターフェイスを模擬していたが、私はチェックして、このクラスのものはない(MSDNの文書によると)。

これを行うことができるいくつかの他の分離フレームワークがあります。 Microsoft Molesがそれを行うことができるので、TypeMockもあります。


マイクロソフトモグラ:http://research.microsoft.com/en-us/projects/moles/

TypeMock:http://www.typemock.com/

+0

ええ、これらの分離フレームワークのいずれかがこれに対応します。 – scottheckel

2

これはMoqでは不可能です。インターフェイス、抽象クラス、およびクラスを仮想メソッドでモックできます(後者の場合は、Setup()のみを使用して仮想メソッドの動作をモックできます)。

+0

この場合、私は呼び出したい機能への呼び出しを代行するためにプロキシ関数/オブジェクトを書き込む必要があります。バマー。 – MarkP