2016-11-10 14 views
0

N代用機とユニットテストはかなり新しいです。 ユニットテストでは、他の依存関係は気にしません。したがって、このルールを適用するには、ユニットをモックします。Nsubstitute:オブジェクトを模擬してユニットテスト用のパラメータ

私は、メソッドは、オブジェクトのパラメータを持つコードテストするには、この例があります。

class dependency { 
    public int A; 
    public dependency() { 
    // algorithms going on ... 
    A = algorithm_output; 
    } 
} 

class toTest { 
    public int Xa; 
    public void Foo(dependency dep_input){ 
    Xa = dep_input.A; 
    // Xa will be used in an algorithm ... 
    } 
} 

私は、コンストラクタをからかっを考えていたが、私はどのようにNsubstituteに把握することができませんでした。 最終的に、私はこれをどのようにテストするのですか?

+0

NSubstituteでインターフェイスと仮想メソッドのみをモックできます。コンストラクターは、非仮想メソッドまたは静的メソッドと同様に、ノー・ゴーです。クラスにインターフェイスを追加する必要がありますか? –

+0

これをテストしたいと思う場合は、インターフェイスを使いたいと思うでしょう。実際のクラスに依然として依存関係がある場合は、テストに影響を与える可能性のあるコードをそのクラスで実行する可能性があります。また、そのクラスの特定の動作に関するヒントが必要な場合もあります。 –

+0

(私が働いているプロジェクトで何らかの理由で)テストするコードを変更できない場合はどうすればよいですか? @ LasseV.Karlsen –

答えて

4

私はコメントを追加できません。長すぎるため、答えを追加します: Fooをテストする場合は、dep_inputをモックする必要はありません。たとえば、Moqを使用している場合です。しかし、スタブを使用することもできます

public interface IDependency 
{ 
    int A { get; } 
} 

public class Dependency : IDependency 
{ 
    public int A { get; private set; } 

    public Dependency() 
    { 
     // algorithms going on ... 
     A = algorithm_output(); 
    } 

    private static int algorithm_output() 
    { 
     return 42; 
    } 
} 

public class ToTest 
{ 
    public int Xa; 

    public void Foo(IDependency dep_input) 
    { 
     Xa = dep_input.A; 
     // Xa will be used in an algorithm ... 
    } 
} 

[TestFixture] 
public class TestClass 
{ 
    [Test] 
    public void TestWithMoq() 
    { 
     var dependecyMock = new Mock<IDependency>(); 
     dependecyMock.Setup(d => d.A).Returns(23); 

     var toTest = new ToTest(); 
     toTest.Foo(dependecyMock.Object); 

     Assert.AreEqual(23, toTest.Xa); 
     dependecyMock.Verify(d => d.A, Times.Once); 
    } 

    [Test] 
    public void TestWithStub() 
    { 
     var dependecyStub = new DependencyTest(); 

     var toTest = new ToTest(); 
     toTest.Foo(dependecyStub); 

     Assert.AreEqual(23, toTest.Xa); 
    } 

    internal class DependencyTest : IDependency 
    { 
     public int A 
     { 
      get 
      { 
       return 23; 
      } 
     } 
    } 
} 
+0

ああ!これは非常に参考になる例です。ありがとう! @ドミニク –

関連する問題