Saya cukup baru untuk pengujian unit di C # dan belajar menggunakan Moq. Di bawah ini adalah kelas yang saya coba uji.
class MyClass
{
SomeClass someClass;
public MyClass(SomeClass someClass)
{
this.someClass = someClass;
}
public void MyMethod(string method)
{
method = "test"
someClass.DoSomething(method);
}
}
class Someclass
{
public DoSomething(string method)
{
// do something...
}
}
Di bawah ini adalah TestClass saya:
class MyClassTest
{
[TestMethod()]
public void MyMethodTest()
{
string action="test";
Mock<SomeClass> mockSomeClass = new Mock<SomeClass>();
mockSomeClass.SetUp(a => a.DoSomething(action));
MyClass myClass = new MyClass(mockSomeClass.Object);
myClass.MyMethod(action);
mockSomeClass.Verify(v => v.DoSomething(It.IsAny<string>()));
}
}
Saya mendapatkan pengecualian berikut:
Expected invocation on the mock at least once, but was never performed
No setups configured.
No invocations performed..
Saya hanya ingin memverifikasi apakah metode "MyMethod" dipanggil atau tidak. Apakah saya melewatkan sesuatu?
SomeClass
tidak memiliki definisiMyMethod(string)
, yang sepertinya tidak.Jawaban:
Anda memeriksa metode yang salah. Moq mengharuskan Anda menata (dan kemudian secara opsional memverifikasi) metode di kelas ketergantungan.
Anda harus melakukan sesuatu yang lebih seperti ini:
class MyClassTest { [TestMethod] public void MyMethodTest() { string action = "test"; Mock<SomeClass> mockSomeClass = new Mock<SomeClass>(); mockSomeClass.Setup(mock => mock.DoSomething()); MyClass myClass = new MyClass(mockSomeClass.Object); myClass.MyMethod(action); // Explicitly verify each expectation... mockSomeClass.Verify(mock => mock.DoSomething(), Times.Once()); // ...or verify everything. // mockSomeClass.VerifyAll(); } }
Dengan kata lain, Anda memverifikasi panggilan itu
MyClass#MyMethod
, kelas Anda pasti akan meneleponSomeClass#DoSomething
sekali dalam proses itu. Perhatikan bahwa Anda tidak membutuhkanTimes
argumen; Saya baru saja mendemonstrasikan nilainya.sumber
mockSomeClass.VerifyAll();
mencapai hasil yang sama dan menjadi lebih KERING?Mock
dibandingkan denganNSubstitute
adalah bahwa jika Anda mencoba untuk memverifikasi juga parameter dan verifikasi gagal, itu hanya menunjukkan pemanggilan apa yang dilakukan, tetapi tidak menunjukkan apa yang diharapkan jika Anda menggunakan variabel dalam ekspresi verifikasi - itu hanya akan menunjukkan variabel nama, bukan nilainya, jadi Anda harus men-debug untuk memeriksa nilai sebenarnya yang dimiliki variabel itu. NSubstitute hanya akan menampilkan nilai keduanya dan bahkan di tempat yang berbeda.