Como você instruir o NUnit para carregar o arquivo dll.config de uma montagem de um diretório específico?
-
05-07-2019 - |
Pergunta
Se uma montagem contém um arquivo app.config, ConfigurationManager
irá carregá-lo enquanto ele está no mesmo diretório que o projeto NUnit que está em execução através NUnit-Gui. Para ilustrar, considere o seguinte estrutura de pastas.
+ TestFolder
testProject.nunit
+ AssemblyAFolder
assemblyA.dll
assemblyA.dll.config
+ AssemblyBFolder
assemblyB.dll
assemblyB.dll.config
Ambos AssemblyA
e AssemblyB
código exercício que põe em ConfigurationManager
. Se eu executar esses conjuntos de teste de forma independente em NUnit-Gui, ConfigurationManager
vai resolver corretamente os arquivos de configuração locais.
No entanto, se eu testProject.nunit
carga em NUnit-Gui (que contém referências a ambos AssemblyA
e AssemblyB
), olhares ConfigurationManager
para o arquivo de configuração em TestFolder
independentemente de qual conjunto está atualmente em execução.
Existe uma maneira de direcionar NUnit para recarregar a configuração da aplicação para o presente no diretório do assembly atual?
Eis o conteúdo de testProject.nunit
:
<NUnitProject>
<Settings activeconfig="Debug" />
<Config name="Debug" binpathtype="Auto">
<assembly path="AssemblyAFolder\assemblyA.dll" />
<assembly path="AssemblyBFolder\assemblyB.dll" />
</Config>
</NUnitProject>
Solução
O blog NUnit explicou do motivo pelo qual os arquivos de configuração carregar a maneira que eles fazem. Basicamente o que eles disseram foi que NUnit permite que a alça quadro os arquivos de configuração e não faz qualquer da gestão.
Você também pode usar o arquivo testProject.config
que seria carregado no seu caso, para fazer referência os arquivos de configuração para cada um dos conjuntos. Usando o atributo de arquivo appSettings adicionar chaves.
Uma última alternativa é usar o configSource
elemento de atributo para usar a seção em um dos arquivos os conjuntos de configuração.
Espero que isso ajude.
Outras dicas
Nunit é incapaz de localizar o caminho do arquivo App.config em nosso projeto. Então, precisamos contar manualmente o Nunit onde o arquivo App.config é colocado em nosso projeto (obviamente na pasta raiz).
No meu caso, a estrutura do projeto é o seguinte
+ProjectWEBApp//web pages
+Modules
+aspx pages
+web.Config
+projectBusinesslogic //business logic .cs files
+Modules
+.cs
+ProjectTestName// a seperate Nunit test cases project
+Modules
+App.Config
o ProjectWebApp usa as referências de projectBusinesslogic que contém a lógica de negócios. a + ProjectTestName usa a referência de projectBusinesslogic para realizar o teste na lógica de negócio. Os problemas começam aqui, projeto de teste Nunit precisa de seu próprio arquivo app.config. ele não vai usar o arquivo web.config como no caso de projectBusinesslogic, então quando você executar Nunit ele irá pedir um erro
-Null Referência exceção ....... objeto instantâneo não definida para ...........
Soluo Quando você executa o Nunit GUI
- Projeto-> Editar um novo pop-up será aberta ??li>
- Propriedades -> Geral-> Configuração Arquivo Nome> adicionar seu app.config Nome do Arquivo
- Arquivo-> Salvar e fechar a janela de pop-up
- ON Nunit Gui-Arquivo-> Recarregar projeto
e que é a solução simples para o problema
O elemento configSource
solução dada por Mark Lawrence é o que eu estava procurando, e funciona muito bem. O desafio na implementação desta solução no entanto, é fazer com que a carga de configuração de montagem quando a execução de testes de ambos um projeto NUnit explícita (como em meu caso ), e quando executar os testes de unidade para uma assembleia em isolamento (nenhum projeto explícito ). Para conseguir isso, foram necessárias as seguintes modificações para o meu layout do arquivo.
+ TestFolder
testProject.nunit
testProject.config
+ AssemblyAFolder
assemblyA.dll
assemblyA.dll.config
assemblyA.dll.configfragment
+ AssemblyBFolder
assemblyB.dll
assemblyB.dll.config
assemblyB.dll.configfragment
Os arquivos configfragment
são criados para conter a configuração de montagem que foi uma vez nos arquivos config
correspondentes. Depois, os arquivos config
são modificados para conter apenas um elemento configSource
com um caminho relativo para o arquivo configfragment
correspondente. Note-se que a única vez que esta abordagem não funciona é quando assemblyA.dll
e assemblyB.dll
ambos exigem a mesma seção de configuração, como um conflito surgirão ao criar testproject.config
.
Depois de experimentar com esta abordagem, decidi confiar em gerar a configuração de montagem em tempo de execução, e remova a configuração estática arquivos todos juntos. Aqui está um código que demonstra como gerar a configuração e torná-lo acessível, independentemente de como a montagem em teste é carregado.
void WithConfigurationFile(Action method)
{
// Create the assembly configuration.
string settingsSection = "myConfigSectionName";
Configuration config =
ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
config.Sections.Add(
settingsSection,
new ConfigSectionType(/*config element values*/);
config.Save();
try
{
// Invoke the method with the new configuration.
ConfigurationManager.RefreshSection(settingsSection);
method();
}
finally
{
// Revert the assembly configuration.
File.Delete(config.FilePath);
ConfigurationManager.RefreshSection(settingsSection);
}
}
Ao utilizar o ConfigurationManager.OpenExeConfiguration () sobrecarga que faz não aceita um caminho, nós carregar a configuração do diretório de trabalho do aplicativo host, que muda dependendo de como você executar os testes NUnit. Além disso, o try / finally bloquear garantias de que a sua configuração de montagem não irá interferir com outros testes, que podem ou não podem exigir tal configuração.
Finalmente, para usar dentro de uma unidade de teste:
[Test]
void VerifyFunctionality
{
WithConfigurationFile(delegate
{
// implement unit test and assertions here
});
}
Espero que isso ajude outras pessoas que podem ter encontrado problemas semelhantes!
Use o atributo configfile no nível de configuração em seu arquivo .nunit:
<Config name="Debug" configfile="myconfigfilenamegoeshere.config />
Na verdade, se você estiver usando NUnit e um corredor dentro do Visual Studio, você pode furar o seu valor em um App.config em seu projeto de teste. Em seguida, adicione esta linha ao seu evento Post-Build:
copiar / Y “$ (ProjectDir) App.config” “$ (TargetDir) $ (TargetFileName) .config”
Quando você acessar o ConfigurationManager em seus testes, NUnit vai passar os valores em seu app.config para .Net no método initialize.