5

Scrivo test di integrazione per la mia applicazione e uso il mio contenitore per questo. Voglio essere in grado di registrare tutti i componenti come faccio in tempo reale, quindi sovrascrivere alcuni componenti e cambiarli per utilizzare le implementazioni degli stub.Sovrascrivi registrazione Autofac - Test di integrazione con DI

Non vorrei separare il DI e avere un contenitore per i test solo perché voglio testare la cosa reale.

Facendo questo sembra anche brutto:

public class MyRegistrations 
{ 
    public static RegisterAll(bool isInTest= false) 
    { 
      if (isTest) 
      { 
      // Register test fakes 
      } 
      else 
        // Register real components 
     } 
} 

così ho pensato di rilevante registrazioni nel mio enviorment test. Come dovrebbe essere fatto?

Altri modi migliori per raggiungere il mio obiettivo?

Grazie

+0

Posso chiedere perché si desidera simulare i componenti come parte del test di integrazione? Non state cercando funzionalità end-to-end della vostra applicazione che non otterrete con un componente falso? Anche se ciò significa scrivere su un'istanza di database effettiva o su un endpoint WCF ecc. –

+1

@StephenRoss Ci sono casi in cui è molto difficile simulare una situazione specifica in un test di integrazione, ma si desidera testarlo come parte dell'integrazione test; Ad esempio l'agente C & C che avvisa quando il disco è pieno sul server C & C. –

+0

@OldFox Se questo fosse un test di integrazione eseguito sulla mia applicazione, vorrei comunque caricare il disco al massimo. Tu (dovresti) stai già testando in un'unità test che l'interazione sia gestita correttamente, ma ora stai verificando che tutto funzioni correttamente end-to-end (correttamente integrato). Se questo significa scrivere 10 GB di dati vuoti sul disco per un test, così sia, altrimenti come potremmo sapere che stiamo gestendo l'evento (mi aspetto) correttamente e al momento giusto, ecc. –

risposta

2

Autofac userà l'ultima componente registrato come provider predefinito di tale servizio

From the AutoFac documation.

Nel vostro organizzare/configurazione di fase/testInit registrare la prende in giro, quindi risolvere il SUT:

[SetUp] 
public void TestInit() 
{ 
    Mock<IFoo> mock = new Mock<IFoo>(); 
    builder.RegisterInstance(mock.object).As<IFoo>(); 
    ... 
    ... 
    _target = builder.Resolve<The component>(); 
} 

Nota:

Singletons, i membri statici e SingletonLifestyle (registrazione) può causare alcuni problemi. ...

+0

Grazie, la vita sarà facile, ma cosa intendi dicendo che i singleton saranno problematici? Quasi tutti i componenti della mia applicazione sono singleton –

+0

@ S.Peter Ho letto il tuo commento nella domanda, probabilmente non affronterai i problemi che intendevo; Alcuni dei tuoi Singletons potrebbero contenere alcuni riferimenti a oggetti che ti prendono in giro nello scenario X ma non in Y. Questi problemi di solito esistono nei servizi web ... –

1

Beh, per esempio è possibile creare un metodo di azione statica all'interno della vostra radice composizione di modificare la configurazione corrente e chiamare durante i test. Per esempio:

public class CompositionRoot 
{ 
    public static Action<IContainer> OverrideContainer = c => { }; 

    internal static IContainer CreateContainer() 
    { 
     ContainerBuilder builder = new ContainerBuilder(); 

     /// etc. etc. 

     var container = builder.Build(); 

     OverrideContainer(container); 

     return container; 
    } 
} 

Dopo di che è possibile creare una finta di voi server, ad esempio, in questo modo:

[TestFixture] 
public class ConfigurationControllerFixture : BaseServer 
{ 
    [Test] 
    public async Task verify_should_get_data() 
    { 
     var response = await GetAsync(Uri); 
     Assert.AreEqual(HttpStatusCode.OK, response.StatusCode); 
    } 

    protected override string Uri 
    { 
     get { return "api/configuration"; } 
    } 
} 

public abstract class BaseServer 
{ 
    protected TestServer Server; 
    protected abstract string Uri { get; } 

    protected virtual void OverrideConfiguration() 
    { 
     CompositionRoot.OverrideContainer = c => 
     { 
      // new autofac configuration 
      cb.Update(c); 
     }; 

     AppStartup.OverrideConfiguration = c => 
     { 
      // same as explained, but for HttpConfiguration 
     }; 
    } 
} 

[SetUp] 
public void Setup() 
{ 
    OverrideConfiguration(); 

    Server = Microsoft.Owin.Testing.TestServer.Create(app => 
    { 
     var startup = new AppStartup(); 
      startup.Configuration(app); 
    }); 

    PostSetup(Server); 
} 

Speranza che aiuta :)