これは、それらがフルメソッド実装されていると仮定すると、動作するはず
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);
}
あなたは何を試してみましたか?それは正しく見える – Kritner
ブレストポイントを入れたとき私の姓の値はまだ= xxxです。ユニットテストでも失敗しました – codeislife