Rumah > pembangunan bahagian belakang > C++ > Bagaimana Mengolok-olok Kaedah Sambungan dalam Ujian Unit Menggunakan Moq?

Bagaimana Mengolok-olok Kaedah Sambungan dalam Ujian Unit Menggunakan Moq?

DDD
Lepaskan: 2025-01-21 22:26:11
asal
485 orang telah melayarinya

How to Mock Extension Methods in Unit Tests Using Moq?

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();
    }
}
Salin selepas log masuk

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();
}
Salin selepas log masuk

Maklumat pengecualian:

<code>System.ArgumentException: Invalid setup on a non-member method:
x => x.AnotherMethod()</code>
Salin selepas log masuk

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();
    }
}
Salin selepas log masuk

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();
}
Salin selepas log masuk

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!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan