2013-05-01 4 views
0

У меня есть решение для webdriver, в котором есть около 10 проектов. 1 core assembly/dll, которая содержит все распространенные методы и 9 других тестовых сборок, которые используют эти методы в своих тестах.Get NameSpace моего тестового класса

Мне нужно получить доступ к встроенному ресурсу для одной из этих 9 сборок, но мне нужно сделать это изнутри dll. Каков наилучший способ сделать это.

namespace = webdriver.core 
json.cs - reads a json file and returns it as a string 

namespace = webdriver.marketplacestest 
marketplace1Test.cs - calls one of the methods in json.cs such as getName(); 
profile.json - holds {"marketplace1" : "Amazon"} 

, вызывающий встроенный ресурс из известного пространства имен, прост. Я сделал это так:

private static string fromEmbeddedResource(string myNamespace, string myFolder, string fileName) 
{ 
    string result; 
    using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(myNamespace + "." + myFolder + "." + fileName)) 
    using (StreamReader reader = new StreamReader(stream)) 
    { 
     result = reader.ReadToEnd(); 
    } 

    return result; 

} 

Как вы можете видеть, я просто позвонить в следующем и у меня есть файл в виде строки

string json = fromEmbeddedResource("WebDriver.Core", "CFG", "pid.json"); 

Это сложнее, хотя, когда файл встроен в одном из моих тестовые DLL. Кто-нибудь знает, как я могу получить доступ или получить пространство имен сборки? Я пытался ...

Assembly.GetCallingAssembly().GetTypes(); 

, но похоже, что он тянет типы из сборки WebDriver.Core.dll, а не сборки WebDriver.Marketplace1.dll.

+0

string testNamespace = Assembly.GetCallingAssembly(). GetName(). Name; что дает мне правильное имя, но я все еще получаю нулевое значение при использовании (StreamReader reader ... –

ответ

0

Я смог понять это. Проблема, с которой я столкнулась, была сборкой вызовов, не была правильной сборкой, потому что я вызывал метод в моей основной DLL, который вызывал другой метод в моей основной DLL. Я получил его, пропустив сборку, но это было дорого. Чтобы сделать вещи более эффективными, я изменил свой статический класс SettingsRepository, который содержит две сборки в словаре. Таким образом, я могу передать строку «ядро» или «тест» и вытащить сборку, не определяя, использую ли я каждый раз исполняющую сборку или вызывающую сборку.

private static Dictionary<string, object> _assembly = new Dictionary<string,object>(); 
public static Assembly getAssembly (string type) 
{ 
    return _assembly[type] as Assembly; 
} 
public static void addAssembly(string myType, Assembly assembly) 
{ 
    bool containsKey = _assembly.ContainsKey(myType); 
    if (!containsKey) 
    { 
     _assembly.Add(myType, assembly); 
    } 
} 

Когда я начинаю тест, я всегда инициализирую свой класс драйвера, поэтому я добавил следующие два набора в этот конструктор.

Settings.addAssembly("core", Assembly.GetExecutingAssembly()); 
Settings.addAssembly("test", Assembly.GetCallingAssembly()); 

Теперь я могу назвать любую сборку, которую хочу в любое время, когда захочу, и знаю, какой я получаю.

Смежные вопросы