Gunakan Moq untuk mengejek kaedah sambungan
Dalam senario ujian unit, kaedah pelanjutan mungkin perlu digunakan pada antara muka sedia ada. Pertimbangkan perkara berikut:
public interface ISomeInterface { void SomeMethod(); } public static class SomeInterfaceExtensions { public static void AnotherMethod(this ISomeInterface someInterface) { // 方法实现 } } public class Caller { private readonly ISomeInterface someInterface; public Caller(ISomeInterface someInterface) { this.someInterface = someInterface; } public void Main() { someInterface.AnotherMethod(); } }
Untuk menguji kelas Caller
, anda perlu mengejek antara muka ISomeInterface
dan mengesahkan panggilan ke kaedah sambungan AnotherMethod
. Walau bagaimanapun, cuba mensimulasikan x => x.AnotherMethod()
secara langsung menghasilkan pengecualian:
[Test] public void Main_BasicCall_CallsAnotherMethod() { // Arrange var someInterfaceMock = new Mock<ISomeInterface>(); someInterfaceMock.Setup(x => x.AnotherMethod()).Verifiable(); // 这里会抛出异常 var caller = new Caller(someInterfaceMock.Object); // Act caller.Main(); // Assert someInterfaceMock.Verify(); }
Maklumat pengecualian:
<code>System.ArgumentException: Invalid setup on a non-member method: x => x.AnotherMethod()</code>
Untuk menyelesaikan masalah ini, satu cara adalah dengan mencipta objek pembalut untuk kaedah sambungan:
public class AnotherMethodWrapper { public static void CallAnotherMethod(ISomeInterface someInterface) { someInterface.AnotherMethod(); } }
Dalam ujian, kaedah pembalut boleh dipermainkan:
[Test] public void Main_BasicCall_CallsAnotherMethod() { // Arrange var wrapperMock = new Mock<AnotherMethodWrapper>(); wrapperMock.Setup(x => x.CallAnotherMethod(It.IsAny<ISomeInterface>())).Verifiable(); var someInterfaceMock = new Mock<ISomeInterface>(); // 这里需要调整Caller的构造函数,注入wrapperMock.Object // 这部分需要根据实际情况修改,可能需要修改Caller类或者使用其他方法注入依赖 var caller = new Caller(someInterfaceMock.Object); // 此处可能需要修改,注入wrapperMock.Object // Act caller.Main(); // Assert wrapperMock.Verify(); }
Dengan menggunakan pembungkus, panggilan kaedah sambungan boleh dipermainkan dan diuji unit. Perlu diingatkan bahawa kelas Caller
dalam contoh ini perlu diubah suai untuk menggunakan AnotherMethodWrapper
Ini bergantung pada pelaksanaan khusus kelas Caller
, yang mungkin memerlukan suntikan pergantungan atau kaedah lain untuk menyuntik AnotherMethodWrapper
ke dalam. Caller
.
Atas ialah kandungan terperinci Bagaimana Mengolok-olok Kaedah Sambungan dalam Ujian Unit Menggunakan Moq?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!