Модульное тестирование с использованием InternalsVisibleToAttribute требует компиляции с /out:filename.ext? - PullRequest
3 голосов
/ 13 мая 2010

В моем последнем вопросе: Лучшая практика модульного тестирования? / C # атрибут InternalsVisibleTo () для VBNET 2.0 во время тестирования? , я спрашивал о InternalsVisibleToAttribute.

Я прочитал документацию о том, как его использовать, и все хорошо и понятно. Однако я не могу создать экземпляр класса Groupe из моего проекта Testing.

Я хочу иметь возможность создавать экземпляр моего внутреннего класса в моей сборке-обертке из моей тестовой сборки.

Любая помощь приветствуется!

РЕДАКТИРОВАТЬ # 1

Вот ошибка времени компиляции, которую я получаю, когда do пытаюсь создать экземпляр моего типа:

Erreur 2 'Carra.Exemples.Blocs.ActiveDirectory.Groupe' n'est pas доступный через контекст, автомобиль называется 'Private'. C: \ Open \ Projects \ Exemples \ Src \ Carra.Exemples.Blocs.ActiveDirectory \ Carra.Exemples.Blocs.ActiveDirectory.Tests \ GroupeTests.vb 9 18 Carra.Exemples.Blocs.ActiveDirectory.Tests

(Это говорит о том, что мой тип не доступен в этом контексте, потому что он личный.) Но это Друг (внутренний)!

РЕДАКТИРОВАТЬ # 2

Вот фрагмент кода, предложенный для класса Groupe, реализующего открытый интерфейс IGroupe:

#Region "Importations"
Imports System.DirectoryServices
Imports System.Runtime.CompilerServices
#End Region

<Assembly: InternalsVisibleTo("Carra.Exemples.Blocs.ActiveDirectory.Tests")> 

Friend Class Groupe
    Implements IGroupe

#Region "Membres privés"
    Private _classe As String = "group"
    Private _domaine As String
    Private _membres As CustomSet(Of IUtilisateur)
    Private _groupeNatif As DirectoryEntry
#End Region

#Region "Constructeurs"
    Friend Sub New()
        _membres = New CustomSet(Of IUtilisateur)()
        _groupeNatif = New DirectoryEntry()
    End Sub

    Friend Sub New(ByVal domaine As String)
        If (String.IsNullOrEmpty(domaine)) Then Throw New ArgumentNullException()
        _domaine = domaine
        _membres = New CustomSet(Of IUtilisateur)()
        _groupeNatif = New DirectoryEntry(domaine)
    End Sub

    Friend Sub New(ByVal groupeNatif As DirectoryEntry)
        _groupeNatif = groupeNatif
        _domaine = _groupeNatif.Path
        _membres = New CustomSet(Of IUtilisateur)()
    End Sub
#End Region

И код пытается его использовать:

#Region "Importations"
Imports NUnit.Framework

Imports Carra.Exemples.Blocs.ActiveDirectory
#End Region

<TestFixture()> _
Public Class GroupeTests
    <Test()> _
    Public Sub CreerDefaut()
        Dim g As Groupe = New Groupe()
        Assert.IsNotNull(g)
        Assert.IsInstanceOf(Groupe, g)
    End Sub
End Class

РЕДАКТИРОВАТЬ # 3

Черт! Я только что заметил, что не импортировал сборку в свой регион импорта.

Нет, ничего не решил = (

Спасибо!

Ответы [ 3 ]

3 голосов
/ 14 мая 2010

После исследования и исследования, все еще исследуйте и угадайте, что? Вновь исследуя, я нашел ссылку, в которой говорится, что InternalsVisibleTo не был доступен для VB.NET, хотя атрибут был доступен в .NET 2.0. Вот ссылка на вопрос:

InternalsVisibleTo: тестирование внутренних методов в .Net 2.0

Замечание гласит:

В .NET Framework версии 2.0 Visual Basic не поддерживает использование этого атрибута.

Так что это недоступно, вот и все! =)

3 голосов
/ 13 мая 2010

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

Что происходит, когда вы делаете попытку создать экземпляр своего класса из своего тестового проекта?

РЕДАКТИРОВАТЬ: сам конструктор Друг / внутренний? Вам нужен не только доступ к типу, но и доступ к конструктору. По общему признанию это не похоже, что это проблема из-за ошибки компилятора, но я не уверен.

Другие вещи для проверки:

  • Работает ли InternalsVisibleTo на других внутренних членов в этой паре сборок ? Может быть, вы просто не применили InternalsVisibleTo правильно?
  • Является ли Groupe вложенным типом внутри частного типа? Это объяснило бы проблему.

Если это не поможет, было бы хорошо, если бы вы могли опубликовать очень короткий, но полный пример, который не работает - просто тип Friend в одной сборке (вместе с атрибутом InternalsVisibleTo) и другой фрагмент кода, который пытается использовать его.

0 голосов
/ 13 мая 2010

ваша тестовая сборка называется Carra.Exemples.Blocs.ActiveDirectory.Tests?

вы импортировали Carra.Exemples.Blocs.ActiveDirectory.Tests, но, конечно, вы должны просто импортировать Carra.Exemples.Blocs.ActiveDirectory? Какая сборка называется в вашем классе? Похоже, что-то подозрительное происходит.

...