2017-08-27 3 views
2

Je fais des tests d'intégration pour mon API Web OWIN. J'utilise la carte de structure comme conteneur DI. Dans l'un des cas, je dois simuler un appel API (ne peut pas l'inclure dans le test). Comment pourrais-je procéder en utilisant Structure Structure? Je l'ai fait en utilisant SimpleInjector mais la base de code sur laquelle je travaille utilise Structure Map et je n'arrive pas à comprendre comment je ferais cela.Structure Map - Remplacer l'interface par un objet simulé à l'exécution

Solution avec SimpleInjector:

Startup.cs

public void Configuration(IAppBuilder app) 
{ 
    var config = new HttpConfiguration(); 
    app.UseWebApi(WebApiConfig.Register(config)); 

    // Register IOC containers 
    IOCConfig.RegisterServices(config); 
} 

ICOCConfig:

public static Container Container { get; set; } 
public static void RegisterServices(HttpConfiguration config) 
{    
    Container = new Container(); 

    // Register    
    config.DependencyResolver = new SimpleInjectorWebApiDependencyResolver(Container); 
} 

Et dans mon test d'intégration, je me moque sur l'interface qui appelle l'autre API.

private TestServer testServer; 
private Mock<IShopApiHelper> apiHelper; 

[TestInitialize] 
public void Intitialize() 
{ 
     testServer= TestServer.Create<Startup>(); 
     apiHelper= new Mock<IShopApiHelper>(); 
} 

[TestMethod] 
public async Task Create_Test() 
{ 
     //Arrange 
     apiHelper.Setup(x => x.CreateClientAsync()) 
       .Returns(Task.FromResult(true); 

     IOCConfig.Container.Options.AllowOverridingRegistrations = true; 
     IOCConfig.Container.Register<IShopApiHelper>(() => apiHelper.Object, Lifestyle.Transient); 

     //Act 
     var response = await testServer.HttpClient.PostAsJsonAsync("/api/clients", CreateObject()); 

     //Assert 
     Assert.AreEqual(HttpStatusCode.Created, response.StatusCode); 
} 

Je trouve this dans la documentation structure carte, mais il ne me permet pas d'injecter un objet simulé là-dedans (seuls types). Comment puis-je injecter une version fictive de IShopApiHelper (Mock) lors de l'exécution de mes tests d'intégration? (J'utilise la bibliothèque Moq pour se moquer)

Répondre

1

En supposant la même structure d'API que dans l'exemple original, vous pouvez faire à peu près la même chose que dans la documentation liée.

[TestMethod] 
public async Task Create_Test() { 
     //Arrange 
     apiHelper.Setup(x => x.CreateClientAsync()) 
       .Returns(Task.FromResult(true); 

     // Use the Inject method that's just syntactical 
     // sugar for replacing the default of one type at a time  
     IOCConfig.Container.Inject<IShopApiHelper>(() => apiHelper.Object); 

     //Act 
     var response = await testServer.HttpClient.PostAsJsonAsync("/api/clients", CreateObject()); 

     //Assert 
     Assert.AreEqual(HttpStatusCode.Created, response.StatusCode); 
} 
+0

Merci, cela a fonctionné. –