InternalsVisibleTo кажется проигнорированным - PullRequest
5 голосов
/ 21 февраля 2012

Я пытаюсь протестировать приватную функцию в .net.Эта закрытая функция возвращает коллекцию типа myClass, которая является внутренним классом.

Я использовал атрибут сборки InternalsVisibleTo, так что тип myClass известен моему тестовому проекту.

Вот код, который я хочу протестировать:

namespace MyProject
{
    public class Class1
    {
         private List<myClass> myFunction()
         {
             return new List<myClass>();
         }

         internal class myClass
         {
             public int MyProperty { get; set; }
         }   
     }
 }

[TestMethod()]
[DeploymentItem("MyProject.dll")]
public void myFunctionTest()
{
    Class1_Accessor target = new Class1_Accessor(); 
    List<Class1_Accessor.myClass> expected = null; 
    List<Class1_Accessor.myClass> actual;
    actual = target.myFunction();
    Assert.AreEqual(expected, actual);
    Assert.Inconclusive("Verify the correctness of this test method.");
}

и в моем файле информации о сборке:

[assembly: InternalsVisibleTo("MyProject.Test")]

Так почему Visual Studio устанавливает тип списка на Class1_Accessor.myClass, поскольку myClass известен моему тестовому проекту?

Из-за этого я получаю ошибку времени выполнения (не могу преобразовать тип myClass в тип Class1_Accessor.myClass).

Поскольку myFunction является закрытой, VisualStudio генерирует следующий код (который подходит для большинстваиз этого)

[Shadowing("MyProject.Class1")]
public class Class1_Accessor : BaseShadow
{
    protected static PrivateType m_privateType;

    [Shadowing(".ctor@0")]
    public Class1_Accessor();
    public Class1_Accessor(PrivateObject value);

    public static PrivateType ShadowedType { get; }

    public static Class1_Accessor AttachShadow(object value);
    [Shadowing("myFunction@0")]
    public List<Class1_Accessor.myClass> myFunction();

    [Shadowing("MyProject.Class1+myClass")]
    public class myClass : BaseShadow
    {
        protected static PrivateType m_privateType;

        [Shadowing(".ctor@0")]
        public myClass();
        public myClass(PrivateObject value);

        [Shadowing("MyProperty")]
        public int MyProperty { get; set; }
        public static PrivateType ShadowedType { get; }

        public static Class1_Accessor.myClass AttachShadow(object value);
    }
}

Однако я не понимаю, почему он содержит новое определение myClass, так как это внутренний класс, который не должен иметь доступа.Это корень проблемы, на мой взгляд.

Ответы [ 2 ]

4 голосов
/ 21 февраля 2012

не может преобразовать тип myClass в тип Class1_Accessor.myClass

говорит все, что нам нужно знать: просто - у вас есть два разных определения myClass.Типы ограничены сборкой;[InternalsVisibleTo(...)] делает его доступным , но помимо этого: все как обычно.

Найдите, почему / где у вас есть второй myClass и один из:

  • устранение неоднозначности (квалификация пространства имен и т. Д.)
  • переименование одного из них
  • удаление одного из них, если они означают одно и то же, и неправильно дублируются

Это то же самое, что иметь:

namespace A { class Foo {} }
namespace B { class Foo {} }

, то есть два совершенно не связанных класса, называемых Foo, и приведение между ними завершится неудачей.

0 голосов
/ 21 февраля 2012

InternalsVisibleTo не делает приватных участников видимыми для собраний друзей.Он работает с членами / типами, помеченными как внутренние.Проверьте документы здесь .

Обновление

Попробуйте это (в соответствии с этим документ ): заново создайте свой тестовый класс, в диалоговом окне Создать модульный тест нажмите Настройки.В настройках создания теста убедитесь, что флажок Honor InternalsVisibleTo Attribute установлен

...