Um projeto de teste de unidade pode carregar o arquivo app.config do aplicativo de destino?

Eu estou testando um aplicativo .NET (.exe) que usa um arquivo app.config para carregar as propriedades de configuração. O aplicativo de teste de unidade em si não possui um arquivo app.config.

Quando tento testar em unidade um método que utiliza qualquer uma das propriedades de configuração, elas retornam nulo . Eu estou supondo que isso é porque o aplicativo de teste de unidade não vai carregar no app.config do aplicativo de destino.

Existe uma maneira de replace isso ou eu tenho que escrever um script para copiar o conteúdo do app.config de destino para um app.config local?

Este post tipo de pergunta, mas o autor está realmente olhando para isso de um ângulo diferente do que eu sou.

EDIT: devo mencionar que estou usando o VS08 Team System para meus testes de unidade.

A maneira mais simples de fazer isso é adicionar o arquivo .config na seção de implantação no seu teste de unidade.

Para fazer isso, abra o arquivo .testrunconfig dos seus Itens de Solução. Na seção Implantação, adicione os arquivos .config saída do diretório de criação do seu projeto (presumivelmente bin\Debug ).

Qualquer coisa listada na seção de implantação será copiada na pasta de trabalho do projeto de teste antes dos testes serem executados, portanto, o código dependente da configuração será executado corretamente.

Edit: Eu esqueci de adicionar, isso não vai funcionar em todas as situações, então você pode precisar include um script de boot que renomeia a saída .config para coincidir com o nome do teste da unidade.

No Visual Studio 2008, adicionei o arquivo app.config ao projeto de teste como um item existente e selecionei uma cópia como link para garantir que ele não seja duplicado. Dessa forma, só tenho uma cópia na minha solução. Com vários projetos de teste, é muito útil!

Adicionar item existente

Adicionar como link

Quer você esteja usando o Team System Test ou o NUnit , a melhor prática é criar uma biblioteca de classs separada para seus testes. Simplesmente adicionando um App.config ao seu projeto de teste será automaticamente copiado para sua pasta bin quando você compilar .

Se o seu código for dependente de testes de configuração específicos, o primeiro teste que eu escreveria valida que o arquivo de configuração está disponível ( para que eu saiba que não sou insano ):

      

E o teste:

 [TestFixture] public class GeneralFixture { [Test] public void VerifyAppDomainHasConfigurationSettings() { string value = ConfigurationManager.AppSettings["TestValue"]; Assert.IsFalse(String.IsNullOrEmpty(value), "No App.Config found."); } } 

Idealmente, você deve escrever código de forma que seus objects de configuração sejam passados ​​para suas classs. Isso não apenas separa você do problema do arquivo de configuração, mas também permite que você grave testes para diferentes cenários de configuração.

 public class MyObject { public void Configure(MyConfigurationObject config) { _enabled = config.Enabled; } public string Foo() { if (_enabled) { return "foo!"; } return String.Empty; } private bool _enabled; } [TestFixture] public class MyObjectTestFixture { [Test] public void CanInitializeWithProperConfig() { MyConfigurationObject config = new MyConfigurationObject(); config.Enabled = true; MyObject myObj = new MyObject(); myObj.Configure(config); Assert.AreEqual("foo!", myObj.Foo()); } } 

Se você tiver uma solução que contenha, por exemplo, Aplicativo da Web e Projeto de Teste, provavelmente desejará que o Projeto de Teste use o web.config do Aplicativo da Web.

Uma maneira de resolvê-lo é copiar web.config para testar o projeto e renomeá-lo como app.config.

Outra e melhor solução é modificar a cadeia de construção e torná-la para fazer uma cópia automática do web.config para testar o diretório de saída dos projetos. Para fazer isso, clique com o botão direito do mouse em Test Application e selecione properties. Agora você deve ver as propriedades do projeto. Clique em “Build Events” e, em seguida, clique no botão “Edit Post-build …”. Escreva a seguinte linha para lá:

 copy "$(SolutionDir)\WebApplication1\web.config" "$(ProjectDir)$(OutDir)$(TargetFileName).config" 

E clique em OK. (Note que você provavelmente precisará alterar o WebApplication1 ao projetar o nome que deseja testar). Se você tiver um caminho errado para o web.config, a cópia falhará e você perceberá isso durante uma compilation malsucedida.

Editar:

Para copiar do projeto atual para o projeto de teste:

 copy "$(ProjectDir)bin\WebProject.dll.config" "$(SolutionDir)WebProject.Tests\bin\Debug\App.Config" 

Isso é um pouco antigo, mas encontrei uma solução melhor para isso. Eu estava tentando a resposta escolhida aqui, mas parece que o .testrunconfig já está obsoleto.

1. Para testes de unidade, o Wrap the config é uma interface (IConfig)

para testes unitários, config realmente não deve fazer parte do seu teste para criar uma simulação que você pode injetar. Neste exemplo eu estava usando o Moq.

 Mock _configMock; _configMock.Setup(config => config.ConfigKey).Returns("ConfigValue"); var SUT = new SUT(_configMock.Object); 

2. Para o teste de integração, adicione dinamicamente a configuração que você precisa

 Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); if(config.AppSettings.Settings[configName] != null) { config.AppSettings.Settings.Remove(configName); } config.AppSettings.Settings.Add(configName, configValue); config.Save(ConfigurationSaveMode.Modified, true); ConfigurationManager.RefreshSection("appSettings"); 

Eu escrevi recentemente uma postagem de blog sobre como testar as configurações do AppConfig. Espero que isso ajude http://nileshgule.blogspot.com/2010/09/unit-test-application-configuration.html

Se você estiver usando o NUnit, dê uma olhada neste post . Basicamente, você precisará ter seu app.config no mesmo diretório que seu arquivo .nunit.

Isso é muito fácil.

  • Clique com o botão direito no seu projeto de teste
  • Adicionar -> item existente
  • Você pode ver uma pequena seta ao lado do botão Adicionar
  • Selecione o arquivo de configuração, clique em “Add As Link”

Se o aplicativo estiver usando configurações como Asp.net ConnectionString, será necessário adicionar o atributo HostType ao seu método, caso contrário, eles não serão carregados, mesmo se você tiver um arquivo App.Config.

 [TestMethod] [HostType("ASP.NET")] // will load the ConnectionString from the App.Config file public void Test() { } 

Eu uso o NUnit e no meu diretório de projeto eu tenho uma cópia do meu App.Config que eu mudo algumas configurações (exemplo eu redirect para um database de teste …). Você precisa tê-lo no mesmo diretório do projeto testado e você estará bem.

Eu não consegui obter nenhuma dessas sugestões para trabalhar com o nUnit 2.5.10, então acabei usando a funcionalidade Project -> Edit do nUnit para especificar o arquivo de configuração para o destino (como outros disseram que ele precisa estar na mesma pasta que o arquivo. nunit file propriamente dito). O lado positivo disso é que eu posso dar ao arquivo de configuração um nome Test.config que deixa muito mais claro o que é e por que é)