Внутренний класс Moq и/или внутренний метод

В моем проекте я установил:

[assembly: InternalsVisibleTo("xyz")]

Мои модульные тесты работают, когда мой класс и метод общедоступны.

public class MainController
{
    public virtual void RunForm()
    {
        ...
    }

Если я перейду на внутренний, мой модульный тест завершится ошибкой. Является ли это ограничением Moq?

var logger = new Mock<IExceptionLogger>();
var name = new Mock<MainController>
{
    CallBase = true
};
name.Setup(x => x.RunForm()).Throws(new Exception()));
name.Object.Init(logger.Object);
logger.Verify(m => m.LogError(It.IsAny<Exception>(), Times.Once);

Исключение:

Test method Tests.Controllers.MainControllerTest.ExceptionsInitGetLoggedToAppInsights threw exception: 
    System.ArgumentException: Cannot set up MainController.RunForm because it is not accessible to the proxy generator used by Moq:
    Can not create proxy for method Void RunForm() because it or its declaring type is not accessible. Make it public, or internal and mark your assembly with [assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] attribute, because assembly Abc is not strong-named.

person Hoppe    schedule 31.12.2020    source источник
comment
Это должно работать, но вместо директивы сборки вы можете установить параметр в своем .csproj файле: meziantou.net/declaring-internalsvisibleto-in-the-csproj.htm   -  person silkfire    schedule 31.12.2020
comment
@silkfire хм тот же результат   -  person Hoppe    schedule 31.12.2020
comment
@devNull, пожалуйста, напишите как ответ, и я приму. Я видел это в нескольких местах и ​​думал, что это просто означает, что я должен поместить свою сборку в строку. Я не знал, что он мне нужен в дополнение к моей собственной сборке.   -  person Hoppe    schedule 31.12.2020
comment
не могли бы вы предоставить файл {project}/Properties/AssemblyInfo.cs?   -  person vladimir    schedule 31.12.2020


Ответы (1)


Как указано в сообщении об ошибке, вам действительно нужно добавить атрибут [assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] в свою сборку. DynamicProxyGenAssembly2 — это сборка, которую Moq использует внутри для создания прокси-экземпляров вашего класса для переопределения/реализации методов виртуального/интерфейса.

person devNull    schedule 31.12.2020