Как использовать Moq для имитации метода расширения?

Если вы можете изменить код c#-language методов расширения, вы можете c#.net закодировать его следующим mocks образом, чтобы иметь возможность mocking-framework тестировать:

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Moq;

public static class MyExtensions
{
    public static IMyImplementation Implementation = new MyImplementation();

    public static string MyMethod(this object obj)
    {
        return Implementation.MyMethod(obj);
    }
}

public interface IMyImplementation
{
    string MyMethod(object obj);
}

public class MyImplementation : IMyImplementation
{
    public string MyMethod(object obj)
    {
        return "Hello World!";
    }
}

Таким образом, методы c#-language расширения - это только оболочка csharp интерфейса реализации.

(Вы extension-methods можете использовать только c-sharp класс реализации без методов mocking-framework расширения, которые являются mocks своего рода синтаксическим mocks сахаром.)

И вы можете смоделировать c#.net интерфейс реализации и установить moq его как реализацию для класса moq расширений.

public class MyClassUsingExtensions
{
    public string ReturnStringForObject(object obj)
    {
        return obj.MyMethod();
    }
}

[TestClass]
public class MyTests
{
    [TestMethod]
    public void MyTest()
    {
        // Given:
        //-------
        var mockMyImplementation = new Mock();

        MyExtensions.Implementation = mockMyImplementation.Object;

        var myClassUsingExtensions = new MyClassUsingExtensions();

        // When:
        //-------
        var myObject = new Object();
        myClassUsingExtensions.ReturnStringForObject(myObject);

        //Then:
        //-------
        // This would fail because you cannot test for the extension method
        //mockMyImplementation.Verify(m => m.MyMethod());

        // This is success because you test for the mocked implementation interface
        mockMyImplementation.Verify(m => m.MyMethod(myObject));
    }
}

c#

mocking

moq

extension-methods

2022-10-05T00:41:48+00:00
Вопросы с похожей тематикой, как у вопроса:

Как использовать Moq для имитации метода расширения?