2013-06-29 2 views
0

У меня есть странная проблема при попытке модульного тестирования классов ViewModel в проекте UnitTest в Visual Studio 2012. Я создал проект UnitTest и добавил его в свой Solutinon. Я добавил проект WPF в качестве ссылки на мой проект UnitTest, чтобы проверить мои классы ViewModel и их методы. Проблема в том, что я не могу получить доступ к моим классам ViewModel. Допустим, я типа:Доступ к классам WPF в проекте UnitTest

[TestClass] 
public class UnitTest1 
{ 
    [TestMethod] 
    public void TestMethod1() 
    { 
     MyWPFProject.ViewModels.MainViewModel 
    } 
} 

Это действует как нет класса MainViewModel в ViewModels папке. Что может быть проблемой здесь?

ответ

1

Это, вероятно, из-за вас объявить свой MainViewModel класс с внутренним модификатором доступа:

namespace ViewModels 
{ 
    internal class MainViewModel 
    { 
     ... 
    } 
} 

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

Атрибут сборки InternalsVisibleTo позволяет указать «друг» сборки, которые могут просматривать ваши внутренние элементы сборки. Чтобы определить атрибут, открытый AssemblyInfo.cs (должен быть в проекте по умолчанию - расширить «Свойство» узел в обозревателе решений) и вставьте следующее, кроме любых другого узла атрибуты:

[assembly: InternalsVisibleTo("Code")] 

Изменения строка «Код» на имя вашего проекта тестирования устройства.

См., В моем случае, я ссылался на CodeWPF из Code. Также см. Выделенный класс AssemblyInfo, он должен быть очень понятным, где определить атрибут.

enter image description here

+0

благодаря модификатор доступа общественности решает эту проблему, но вы можете дать мне несколько примеров использования InternalsVisibleTo –

+0

@ZoroRoronoa нп. Я обновил свой пост. –

+0

Благодарим за подробное описание, добавив это в AssemblyInfo. Все классы и методы были видны в модуле UnitTestProject, потому что они по умолчанию являются внутренними. Большое спасибо :) –