首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在使用MEF 2( WebApi 2 (System.Composition) )时模拟System.Composition 2控制器的依赖关系?

如何在使用MEF 2( WebApi 2 (System.Composition) )时模拟System.Composition 2控制器的依赖关系?
EN

Stack Overflow用户
提问于 2014-09-04 15:45:24
回答 1查看 529关注 0票数 1

使用MEF (System.ComponentModel.Composition),可以向容器中添加模拟对象。

代码语言:javascript
复制
container.ComposeExportedValue(mock.Object);

参考文献:https://stackoverflow.com/a/10223318/444244

如何使用可移植的MEF库(System.Composition)?

为了获得更多的上下文,我将发布一堆我到目前为止得到的代码。

我正在内存中的xBehave.net ASP.NET网络API上创建ASP.NET网络API集成测试。

我就这样安排了客户。

代码语言:javascript
复制
config = new HttpConfiguration();
WebApiConfig.Register(config);
config.DependencyResolver = MefConfig();
server = new HttpServer(config);
Client = new HttpClient(server);
Request = new HttpRequestMessage();

我设置了MEF配置,就像WebApiContrib.IoC.Mef的默认配置一样。

代码语言:javascript
复制
private static IDependencyResolver MefConfig()
{
    var conventions = new ConventionBuilder();
    conventions.ForTypesDerivedFrom<IHttpController>().Export();
    conventions.ForTypesMatching(
        t => t.Namespace != null && t.Namespace.EndsWith(".Parts"))
        .Export()
        .ExportInterfaces();

    var container = new ContainerConfiguration()
        .WithAssemblies(
            new[] { Assembly.GetAssembly(typeof(ICache)) }, conventions)
        .CreateContainer();

    return new MefDependencyResolver(container);
}

这是我想测试的控制器的签名。它从缓存中读取。

代码语言:javascript
复制
public MyController(ICache cache) { }

这是测试。模拟是用莫克创建的。

代码语言:javascript
复制
[Scenario]
public void RetrieveOnPollingRequest()
{
    const string Tag = "\"tag\"";
    string serverETag = ETag.Create(Tag);

    "Given an If-None-Match header"
        .f(() => Request.Headers.IfNoneMatch.Add(
            new EntityTagHeaderValue(Tag)));
    "And the job has not yet completed"
        .f(() =>
            {
                string tag = serverETag;
                this.MockCache.Setup(x => x.StringGet(tag)).Returns(Tag);
            });
    "When retrieving jobs"
        .f(() =>
            {
                Request.RequestUri = uri;
                Response = Client.SendAsync(Request).Result;
            });
    "Then the status is Not-Modified"
        .f(() =>
            Response.StatusCode.ShouldEqual(HttpStatusCode.NotModified));
}

那么,如何将模拟输入容器,而不是已经导出的部件?或者我不是吗?我需要去使用不同的IoC容器吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-06 11:35:48

您可以使用Microsoft.Composition.Demos.ExtendedPartTypes示例中从MEF站点采取的方法来完成这一操作。下面显示了为mockObject服务注册实例IAmMocked

代码语言:javascript
复制
var container = new ContainerConfiguration()
    .WithExport<IAmMocked>(mockObject)
    .WithAssemblies(
        new[] { Assembly.GetAssembly(typeof(ICache)) }, conventions)
    .CreateContainer();

您将在这里找到完整的代码:http://mef.codeplex.com/SourceControl/latest#oob/demo/Microsoft.Composition.Demos.ExtendedPartTypes/Program.cs

我们打算在某个时候把这件事“放进盒子里”,但我不相信它已经发生了。如果你有任何困难让它运行,请告诉我!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25669720

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档