Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Mengejek Kaedah Sambungan dengan Berkesan dalam Ujian Unit Menggunakan Moq?
Menakluki Kaedah Sambungan Mengejek dengan Moq: Panduan Praktikal
Ujian unit yang berkesan selalunya bergantung pada kebergantungan yang mengejek. Walau bagaimanapun, kaedah sambungan mengejek, yang menambah fungsi pada antara muka sedia ada, memberikan cabaran yang unik. Mari kita terokai masalah ini dan penyelesaiannya.
Bayangkan ISomeInterface
dan kaedah sambungannya ditakrifkan dalam SomeInterfaceExtensions
. Kelas Caller
menggunakan sambungan AnotherMethod
:
<code class="language-csharp">public interface ISomeInterface { } 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(); } }</code>
Ujian Caller.Main()
memerlukan ejekan ISomeInterface
dan mengesahkan panggilan AnotherMethod
. Walau bagaimanapun, mengejek kaedah sambungan dengan Moq secara langsung, mengakibatkan ralat "Persediaan tidak sah pada kaedah bukan ahli".
Punca Masalah
Keterbatasan Moq berpunca daripada sifat kaedah sambungan. Ia bukan sebahagian daripada definisi antara muka; Moq bergantung pada ahli antara muka untuk mengejek.
Kaedah Pembungkus: Penyelesaian Teguh
Penyelesaian praktikal melibatkan mencipta kelas pembalut yang merangkumi logik kaedah sambungan:
<code class="language-csharp">public class SomeInterfaceExtensionWrapper { private readonly ISomeInterface wrappedInterface; public SomeInterfaceExtensionWrapper(ISomeInterface wrappedInterface) { this.wrappedInterface = wrappedInterface; } public void AnotherMethod() { wrappedInterface.AnotherMethod(); // Calls the extension method } }</code>
Kini, ujian boleh mengejek pembalut:
<code class="language-csharp">var wrapperMock = new Mock<SomeInterfaceExtensionWrapper>(); wrapperMock.Setup(x => x.AnotherMethod()).Verifiable(); var caller = new Caller(wrapperMock.Object); caller.Main(); wrapperMock.Verify();</code>
Strategi Alternatif
Walaupun pendekatan pembalut berkesan, ia menambahkan kerumitan. Pertimbangkan alternatif ini:
Pendekatan terbaik bergantung pada konteks dan keutamaan projek anda.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengejek Kaedah Sambungan dengan Berkesan dalam Ujian Unit Menggunakan Moq?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!