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)
Merci, cela a fonctionné. –