2012-03-21 7 views
2

私は奇妙な問題があります。私はあまりにもGUIの男であるMoqにはあまりよく知られていません。私は自分のコードでファクトリメソッドをモックしようとしました。ファクトリはこのように見え、多くのIO操作を行うISettingsインスタンスを返します。私はそれが私のテストを加速するためにメモリだけのISettingsインスタンスを返すようにします。Moq - mock.Object.MyMethod mockingが機能しません

public class SettingsFactory 
{ 
    internal ISettings mSettingsImpl; 
    internal virtual ISettings CreateOrGetSettings() 
    { 
     return mSettingsImpl ?? (mSettingsImpl = new XmlSettings()); 
    } 
} 

とモック

var imocked = new Mock<SettingsFactory>() {CallBase = false}; 
imocked.Setup(x => x.CreateOrGetSettings()).Returns(new NonPersistingSettings()); 
var tryToSeeTheType = imocked.Object.CreateOrGetSettings(); 

tryToSeeTheTypeしかしXMLSettingsなくNonPersistingSettings私が期待するようです。結果をコードにステップすると、元のファクトリメソッドに直接入ります。私がここで間違っていることを示唆していますか?

+3

Moqが内部メソッドにアクセスできるようにするには '[InternalsVisibleTo()]'を持っていますか? - http://stackoverflow.com/questions/1458300/moq-how-do-you-test-internal-methods –

+0

私は私の単体テストプロジェクトにしか持っていませんでした。これをMoqに公開し、ISettingsFactoryインターフェイスを導入する必要がありました。そうしなければ、クラスを公開する必要がありました。このように動作します。提案ありがとう! –

答えて

0

モックされたオブジェクトの "Object"プロパティは、実際にあなたがモックしようとしているクラスのインスタンスではありません。

モックの目的は、テストしようとしているメソッドが依存するオブジェクトを置き換えることです。

あなたのSettingsFactoryが、ネットワークやデータベースやファイルシステムにアクセスするなどの非常に高価な操作を実行するとします。あなたはあなたのテストがそれらの高価なリソースにアクセスしてモックを作成しないようにします。このユニットテストは基本的にのみことを確認することさ

[TestMethod] 
public void MakeSureSettingsFactoryIsCalled() 
{ 
    var settingsFactoryMock = new Mock<SettingsFactory>(); 

    settingsFactoryMock.Setup(f => f.CreateOrGetSettings(), Times.Once).Verifiable(); 

    var subjectUnderTest = new ClassThatUsesSettingsFactory(settingsFactoryMock.Object); 

    subjectUnderTest.MethodThatCallsSettingsFactory(); 

    settingsFactoryMock.Verify(); 
} 

:これにより

public class ClassThatUsesSettingsFactory 
{ 
    private readonly SettingsFactory _settingsFactory; 

    public ClassThatUsesSettingsFactory(SettingsFactory settingsFactory) 
    { 
     _settingsFactory = settingsFactory; 
    } 

    public void MethodThatCallsSettingsFactory() 
    { 
     //... do something 
     var settings = _settingsFactory.CreateOrGetSettings(); 
     //... do something 
    } 
} 

あなたがそうのようなあなたのユニットテストでモックでSettingsFactoryを交換することができます:私はこのようなものになるだろうCreateOrGetSettingsメソッドは、MethodThatCallsSettingsFactoryが実行されたときに一度だけ呼び出されます。

Moqのやり方は、仮想メソッドの実装が異なる別のクラスを作成することです。これは、ほとんどの場合、呼び出されるとフラグをtrueに設定し、 "Verify"メソッドでそのフラグの値をチェックします。

ここではたくさんのことがわかりますので、あなたはMoqで多くの経験をしていないと言いましたので、十分明確であることを願っています。

関連する問題