2017-06-05 3 views
2

Wir verwenden UnityAutoMoq, um die meisten unserer Schnittstellen in unseren Komponententests zu verspotten, aber ich bin kürzlich in eine Situation geraten, in der wir ein Testframework verwenden wollen, um das tatsächliche Verhalten vollständiger zu simulieren (nennen Sie es ein Integrationstest, wenn das hilft, das zu akzeptieren, was ich tue).Generische Schnittstellen mit UnityAutoMoqContainer registrieren

Ich erwartete von UnityAutoMoq, dass ich konkrete Zuordnungen registrieren konnte, anstatt dem UnityAutoMoqContainer zu erlauben, sich auf das Interface zu verspotten. Dies gilt für alles, was ich versucht habe, außer für generische Schnittstellen. Falls Sie wie ich visuelle sind, ist hier ein Ausschnitt von dem, was ich versuche:

public static void Register(IUnityContainer container) 
{ 
    ... 
    container.RegisterType(typeof(IService<>), typeof(TestFrameworkService<>), 
     new HierarchicalLifetimeManager(), new InjectionFactory(Create)); 
    ... 
} 

private static object Create(IUnityContainer container, Type type, string name) 
{ 
    var T = type.GetGenericArguments().Single(); 
    return new TestFrameworkService<T>();// For simplicity, pretend this works 
} 

Wie man sich von oben sehen kann, ich bin die generische Schnittstelle zu einem allgemeinen konkreten Registrierung, dann bei der Injektion in Abhängigkeit Factory, um es mit dem eingehenden Typ zu lösen (die eigentliche Implementierung wurde der Einfachheit halber weggelassen). Dies funktioniert mit einem normalen UnityContainer, der den erwarteten Beton zurückgibt. Der UnityAutoMoqContainer gibt stattdessen einen Schein zurück, wobei die Injektionsfabrik vollständig umgangen wird.

Hat jemand versucht etwas wie was ich versuche zu erreichen? Irgendwelche Ideen?

Antwort

0

Ich fand, dass das Problem in der zugrunde liegenden BuilderStrategy liegt. Hier ist ein Ausschnitt aus UnityAutoMoqBuilderStrategy.

Fazit ist, dass die Builder-Strategie sieht, dass die Schnittstelle nicht registriert ist und seine Erstellung abfängt. Dies liegt daran, dass generische Typdefinitionen nicht den generischen Typen selbst entsprechen.

Ich schaute in AutoMoq, das weit vor kurzem aktualisiert wurde, aber es leidet unter der gleichen Abfangbeschränkung, die verhindert, dass die Einspritzfabrik abfeuert.

Als Referenz sind hier die automocking Bibliotheken, die ich recherchiert:

Wenn jemand eine Empfehlung hat, dann lass es mich wissen, sonst Ich werde dies als die Antwort betrachten.

Verwandte Themen