2016-04-28 2 views
1

Ich bin ein Noob mit Schloss Windsor. Ich baue eine Anwendung, die Entity Framework 6 und Castle Windsor mit einer MSTest Unit Test-Klasse verwendet. Meine Anwendung enthält eine Klasse, die IWindsorInstaller implementiert. Meine Unit-Test-Klasse sieht wie folgt aus:Mit Schloss Windsor in Einheit Test Klasse

[TestClass] 
public class DatabaseTests { 

    static readonly WindsorContainer Container = new WindsorContainer(); 

    public DatabaseTests() { 
     Container.Install(FromAssembly.This()); 
    } 

    [TestMethod] 
    public void FirstTest() { 
     // Test statements 
    } 

    [TestMethod] 
    public void SecondTest() { 
     // Test statements 
    } 

    // Other tests 
} 

Es gibt auch ein Installer-Klasse in der Unit-Tests Projekt, das wie folgt aussieht:

public class TestsInstaller : IWindsorInstaller { 
    public void Install(IWindsorContainer container, IConfigurationStore store) { 
     container.Install(new RecipeManager.RepositoriesInstaller()); 
    } 
} 

Als ich zur Einheit Test Session Fenster gehen & versuchen, läuft alle Tests, die ersten erfolgreich ist, und ich bekomme diesen Stack-Trace für den Rest:

Unable to create instance of class UnitTests.DatabaseTests. Error: Castle.MicroKernel.ComponentRegistrationException: Component RecipeManager.DAL.CategoryRepository could not be registered. There is already a component with that name. Did you want to modify the existing component instead? If not, make sure you specify a unique name.. at Castle.MicroKernel.SubSystems.Naming.DefaultNamingSubSystem.Register(IHandler handler) at Castle.MicroKernel.DefaultKernel.AddCustomComponent(ComponentModel model) at Castle.MicroKernel.DefaultKernel.Register(IRegistration[] registrations) at Castle.Windsor.WindsorContainer.Register(IRegistration[] registrations) at RecipeManager.RepositoriesInstaller.Install(IWindsorContainer container, IConfigurationStore store) in C:\Users\Tony\documents\visual studio 2015\Projects\RecipeManager\ManageRecipes\RepositoriesInstaller.cs:line 10 at Castle.Windsor.WindsorContainer.Install(IWindsorInstaller[] installers, DefaultComponentInstaller scope) at Castle.Windsor.WindsorContainer.Install(IWindsorInstaller[] installers) at UnitTests.TestsInstaller.Install(IWindsorContainer container, IConfigurationStore store) in C:\Users\Tony\documents\visual studio 2015\Projects\RecipeManager\UnitTests\TestsInstaller.cs:line 8 at Castle.Windsor.Installer.AssemblyInstaller.Install(IWindsorContainer container, IConfigurationStore store) at Castle.Windsor.WindsorContainer.Install(IWindsorInstaller[] installers, DefaultComponentInstaller scope) at Castle.Windsor.WindsorContainer.Install(IWindsorInstaller[] installers) at UnitTests.DatabaseTests..ctor() in C:\Users\Tony\documents\visual studio 2015\Projects\RecipeManager\UnitTests\DatabaseTests.cs:line 17

Wenn ich das Gerät testet einen nach dem anderen ausgeführt werden, sie alle folgen. Ich beabsichtige, viele Tests zu erstellen, also würde ich wirklich lieber in der Lage sein, sie alle auf einmal laufen zu lassen. Wie behebe ich das?

+0

Ich frage mich, ob die Verwendung von Castle, um Ihre Abhängigkeitsinjektion für Tests zu behandeln, eigentlich eine schlechte Idee ist. 1) Sie verletzt das Prinzip der Selbstdokumentation für Komponententests, da Abhängigkeiten jetzt verborgen sind, und 2) wenn Sie Ihre Abhängigkeiten ändern, wird Ihr Code immer noch kompiliert, wodurch Code möglicherweise unbedeckt bleibt. – gdbj

Antwort

2

Erstellen Sie in Ihrer Testklasse ein Feld.

private WindsorContainer Container; 

(. Ersetzen Sie die vorhandene statische Feld)

Dann fügen Sie diese Klasse zu Ihrem Test:

[TestInitialize] 
public void SetUp() 
{ 
    Container = new WindsorContainer(); 
    // register your dependencies 
} 

[TestCleanup] 
public void Cleanup() 
{ 
    Container.Dispose(); 
} 

[TestInitialize] läuft, bevor überhaupt Test, [TestCleanup] nach jedem Test.
Auf diese Weise verwenden Sie nicht denselben Container für jeden Test und versuchen, die gleichen Abhängigkeiten mit diesem Container erneut zu registrieren. Bevor jeder einzelne Test ausgeführt wird, erstellen Sie einen neuen Container. Wenn Sie für jeden Test dieselben Abhängigkeiten benötigen, können Sie sie in Setup() registrieren. Oder Sie können sie bei Bedarf in den Testmethoden registrieren.

+0

Ich war nur klicken Sie auf "posten Sie Ihre Antwort", wenn ich sage, dass Ihre Pop-up. Kein falscher Punkt für mich und einige falsche Punkte für dich – gh9

+0

Ich weiß eigentlich nicht, was das bedeutet. Wir bekommen dafür Punkte? –

+0

die Rufpunkte, die Sie für die Beantwortung von Fragen erhalten – gh9