Silverlight 单元测试由MEF导入值的类

Silverlight 单元测试由MEF导入值的类,silverlight,unit-testing,mef,Silverlight,Unit Testing,Mef,我有一个名为“ViewFactory”的类,这个类应该提供正确的视图 现在,它只有一个方法(而且它会增长),我想针对它编写一个单元测试 这个班看起来像这样 public class ViewFactory { [ImportMany(AllowRecomposition=true)] IEnumerable<ExportFactory<DependencyObject, IViewMetaData>> Views { get; set; }

我有一个名为“ViewFactory”的类,这个类应该提供正确的视图

现在,它只有一个方法(而且它会增长),我想针对它编写一个单元测试

这个班看起来像这样

  public class ViewFactory
{

       [ImportMany(AllowRecomposition=true)]
    IEnumerable<ExportFactory<DependencyObject, IViewMetaData>> Views { get; set; }

    public DependencyObject GetViewByName(string name)
    {
        DependencyObject view = null;

        try
        {
            view = Views.Where(v => v.Metadata.ViewName == name).FirstOrDefault().CreateExport().Value;
            return view;
        }
        catch (Exception ex)
        {

            return view;
        }
    }
}
公共类ViewFactory
{
[进口数量(AllowRecomposition=true)]
IEnumerable视图{get;set;}
公共依赖对象GetViewByName(字符串名称)
{
DependencyObject视图=空;
尝试
{
视图=视图。其中(v=>v.Metadata.ViewName==name)。FirstOrDefault().CreateExport().Value;
返回视图;
}
捕获(例外情况除外)
{
返回视图;
}
}
}
我想做的是测试我的方法,但不知道如何做,因为视图列表是在运行时组成的

我想测试我是否获得了一个有效名称的视图 及 我还想测试如果我有一个无效的名字,我是否会得到null


正确的方法是什么?

您将为您的
视图工厂
提供一组适用于特定测试的
导出工厂
值。不同的测试可能有不同的集合,以允许您测试不同的东西。基本上,您是在伪造注入的依赖项。

以下是代码(针对Silverlight)

var viewFactory=new viewFactory();
//手动满足导入(单元测试中没有MEF!)
var factories=新列表();
var tuple=new tuple(new MyObject(),()=>{});
var metaData=新的MyViewMetaData();
var factory=newexportfactory(()=>元组,元数据);
工厂。添加(工厂);
viewFactory.Views=工厂;

感谢您的回复。你能提供一些细节吗?你的意思是只列出清单吗?或者你的意思是用一些mef魔术来伪造或嘲弄构图。。。如果是这样,怎么办?如果您能提供更多详细信息,那就太好了…@silverfighter有关如何测试MEF类的更多详细信息,请参阅此问题:@silverfighter:我根本不会使用MEF本身来设置列表。。。这听起来不像是单元测试应该做的事情。只需在单元测试中手动设置
视图
,就好像您根本没有使用MEF一样。
var viewFactory = new ViewFactory();

// Satisfy the imports manually (No MEF in unit tests!)
var factories = new List<ExportFactory<DependencyObject, IViewMetaData>>();
var tuple = new Tuple<DependencyObject, Action>(new MyObject(), () => { });
var metaData = new MyViewMetaData();
var factory = new ExportFactory<DependencyObject, IViewMetaData>(() => tuple, metaData);
factories.Add(factory);
viewFactory.Views = factories;