Como você instruir o NUnit para carregar o arquivo dll.config de uma montagem de um diretório específico?

StackOverflow https://stackoverflow.com/questions/1412235

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>
Foi útil?

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

  1. Projeto-> Editar um novo pop-up será aberta
  2. Propriedades -> Geral-> Configuração Arquivo Nome> adicionar seu app.config Nome do Arquivo
  3. Arquivo-> Salvar e fechar a janela de pop-up
  4. 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top