2016-03-31 13 views
2

別のメソッド内で呼び出されたメソッドをモックしようとしています。テスト用のメソッドをモック

public virtual bool hello(string name, int age) 
{ 

    string lastName = GetLastName(); 
} 

public virtual string GetLastName() 
    { 
     return "xxx"; 
    } 

Mock<program> name= new Mock<program>(); 
name.Setup(x => x.GetLastName()).Returns("qqq"); 

GetLastNameメソッドは常に "qqq"を返すようにします。

+0

あなたは何を試してみましたか?それは正しく見える – Kritner

+0

ブレストポイントを入れたとき私の姓の値はまだ= xxxです。ユニットテストでも失敗しました – codeislife

答えて

1

これは、それらがフルメソッド実装されていると仮定すると、動作するはず

public class MyProgram 
{ 

    public bool hello(string name, int age) 
    { 
     string lastName = GetLastName(); 

     return string.Format("hello {0}", lastName); 
    } 

    public virtual string GetLastName() 
    { 
     return "xxx"; 
    } 
} 

public class MyProgramTests 
{ 

    [TestMethod] 
    public void MyTest() 
    { 

     string stringToReturn = "qqq"; 
     Mock<MyProgram> name = new Mock<MyProgram>(); 
     name.CallBase = true; 
     name.Setup(x => x.GetLastName()).Returns(stringToReturn); 

     var results = name.Object.hello(It.IsAny<string>(), It.IsAny<int>()); 

     string expected = string.Format("hello {0}", results); 

     Assert.AreEqual(expected, results); 
    } 
} 

私はまだ非常にあなたのコメント次はないよ:

パラメータが本当に何をすべきモックの何を意味するのでしょう?あれ?私は文法をよく理解していません。明確にするために、模擬とは、自分のコードにブレークポイントを置くと、ブレークポイントは私が嘲笑しているメソッドをスキップしなければならないということです。私は正しい?また、クラスのほとんど何を意味し、一般的な指標であることT -

Mock<T>

あなたは Tの種類を模擬することができます。伝統的には、実際には classではなく、 interfaceを嘲笑しますが、上記の例では、クラスを嘲笑しています。掲載されたサンプルユニットテストの場合、ユニットテストの目的は hello(string, int)の実装をテストすることです。 hello(string, int)は、 GetLastName()というクラス内の別のメソッドに依存しています。 GetLastName()の実装は重要ですが、ユニットテストの範囲では重要ではありません hello(string, int)。このため、依存関係の実装について心配することなく、 hello(string, int)の機能をテストするために、呼び出しとその戻り値を疑似します。

私はうまくいけば、我々はクラスMyProgramをあざけると答えのためGetLastName()

感謝の新しい実装(モック)を提供していること、それがより明確にするために、実際のクラス名で上記に囲まれています。別のメソッドを呼び出す別のメソッドを呼び出すメソッドをテストしたいのですが?たとえば。メソッドhelloが別のメソッドを呼び出すとどうなりますか?あなたのユニットテストを構築しているとき

同じ原理は、適用される(彼らはユニットテストではなく、統合テストや他のは、あなたが常に公共のテストに集中したいと仮定方法。What's the difference between unit and integration tests?

public class Foo 
{ 

    public string Bar() 
    { 
     return string.Format("{0}Bar", Baz(5));; 
    } 

    public virtual string Baz(int someNumber) 
    { 
     return string.Format("{0}Baz", DoStuff(someNumber).ToString()); 
    } 

    public virtual int DoStuff(int someNumber) 
    { 
     return someNumber+1; 
    } 

} 

を、我々は、ユニットテストBar()なら、我々はBaz(int)の実装やさらに悪いことを気にしません。注実装については気にしませんdoは値を返すように注意してください。 Bar()の観点からは、重要なのはBaz(int)が文字列を返すことだけです。何の文字列ですか? Bar()のユニットテストには関係ありません。

サンプルBar()ためのテスト:私たちはBaz(int)の実際の実装を無視しているとして、上記で

[TestMethod] 
public void Bar_ReturnsBazValueWithBarAppended 
{ 
    // Arrange 
    string testBazReturn = "test"; 
    Mock<Foo> mock = new Mock<Foo>(); 
    mock.CallBase = true; 
    mock 
     .Setup(s => s.Baz(It.IsAny<int>()) 
     .Returns(testBazReturn); 

    // Act 
    var results = mock.Object.Bar(); 

    // Assert 
    Assert.AreEqual(string.Format("{0}{1}", testBazReturn, "Bar"), results); 
    mock.Verify(v => v.Baz(It.IsAny<int>())); // Verifies that Baz was called 
} 

お知らせ、Baz(int)の私たちの実際の実装、およびDoStuff(int)は、問題ではない、とDoStuff(int)ても来ません遊びに入る。今、私たちはユニットテストBaz(int)していることを、我々はおよそBar()、とだけを気にしない、上記で

[TestMethod] 
public void Baz_ReturnsDoStuffValueWithBazAppended 
{ 
    // Arrange 
    int testDoStuffReturn = 1; 
    Mock<Foo> mock = new Mock<Foo>(); 
    mock.CallBase = true; 
    mock 
     .Setup(s => s.DoStuff(It.IsAny<int>()) 
     .Returns(testDoStuffReturn); 

    // Act 
    var results = mock.Object.Baz(5); 

    // Assert 
    Assert.AreEqual(string.Format("{0}{1}", results, "Baz"), results); // Validates the result 
    mock.Verify(v => v.DoStuff(It.IsAny<int>())); // Verifies that DoStuff was called 
} 

:我々はBaz(int)をテストした場合

今、私たちは同じ考え方に従ってください(それはその値に到達したかなく。)私たちはDoStuff(int)に気に事、それが値を返すということです

そして最後にDoStuff(int)

[TestMethod] 
public void DoStuff_ReturnsParameterPlusOne() 
{ 
    // Arrange 
    Foo foo = new Foo(); 
    int passed = 1; 
    int expected = passed + 1; 

    // Act 
    var results = foo.DoStuff(passed); 

    // Assert 
    Assert.AreEqual(expected, results); 
} 
+0

私はベースクラスまたは拡張クラスを使うべきですか? (モックのパラメータ) – codeislife

+0

私はあなたの質問を理解していない、あなたはあなたが意味するもののサンプルで質問で精緻化することはできますか? – Kritner

+0

このパラメータはMockの実際の意味は何ですか何が必要ですか?あれ?私は文法をよく理解していません。明確にするために、模擬とは、自分のコードにブレークポイントを置くと、ブレークポイントは私が嘲笑しているメソッドをスキップしなければならないということです。私は正しい? – codeislife

関連する問題