2016-09-19 10 views
0

は、私はクラスを持っていると言う:回避(NUnitの)

public class SomeClass { 

    public Model _model; 

    public SomeClass() { 
    _model = new Model(); 
    } 

    public void Foo() { 
    _model.DoSomethingHeavy(); 
    } 

} 

とテスト:

[TestFixture] 
public class SomeClassTest { 

    [Test] 
    public void TestFooCalledSomethingHeavy() { 
    SomeClass someClass = NSubstitute.Substitute.For<SomeClass>(); 
    someClass.Foo();   
    someClass._model.Received().DoSomethingHeavy(); 
    } 
} 

I)が(そのsomeClass.Fooをテストしようとしています。 _model.DoSomethingHeavy()と呼ばれていますが、実際にはDoSomethingHeavyを実行したくありません。どうすればいい?それとも、これは間違ったアプローチですか?

+0

コンパイラディレクティブに精通していますか?それを試してみてください。あるいは、 'IsTest'のための.Configファイルにエントリを入れて、実行時に.Configキーエントリに基づいてチェックしてください。 – MethodMan

+0

私は私が従うかどうかわかりません。 .Configファイルは何をしますか?私はコンパイラ指令noに慣れていません。このテストはUnityのテストランナを介して実行されています。 – aaronjbaptiste

+0

'#If TEST'でgoogle検索を行います。 ' Unityのテストランナーでコンパイラディレクティブを使用してC#stackoverflowを実行し、コンパイラディレクティブの内容と使用方法を読み上げてください。たとえば '#if Debug'のようなデバッグモードで動作していて、私が模擬的に渡すことができたので、モデルを渡すことがここの鍵でした。 – MethodMan

答えて

4

メソッドの動作をNS substituteでオーバーライドするには、メソッドがインターフェイスまたは仮想メソッドの一部である必要があります。

まず方法DoSomethingHeavyは、仮想としてマークまたはインタフェースを作成することを確認してください - Modelクラスの(より良い>テストのためのより多くの可能性を与える)

public interface IModel 
{ 
    void DoSomethingHeavy(); 
} 

その後、あなたのModelクラスのインタフェース

public class Model : IModel 
{ 
    public void DoSomethingHeavy() 
    { 
     // heavy staff 
    } 
} 

を実装、テストのために非常に重要 - >Modelのインスタンスを作成する責任を取り除くSomeClass

public class SomeClass 
{ 
    public Model _model { get; private set; } 

    // Constructor will sure, that class get an instance of IModel 
    public SomeClass(IModel model) 
    { 
     _model = model; 
    } 

    public void Foo() 
    { 
     _model.DoSomethingHeavy(); 
    } 
} 

IModelの偽を作成して、実際の実装を実行せずにDoSomethingHeavyのメソッドが実行されていることを確認できます。

SomeClassはテスト中のクラスなので、モックする必要はありません。そのクラスの動作をテストします。

[Test] 
public void TestFooCalledSomethingHeavy() 
{ 
    // Arrange 
    IModel fakeModel = Substitute.For<IModel>(); 
    SomeClass someClass = new SomeClass(fakeModel); 

    // Act 
    someClass.Foo(); 

    // Assert  
    fakeModel.Received().DoSomethingHeavy(); 
} 
+0

よく働く。 – aaronjbaptiste