Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Stub在具体类中但不在单元测试接口上的属性_C#_Unit Testing_Mocking_Mef_Rhino Mocks - Fatal编程技术网

C# Stub在具体类中但不在单元测试接口上的属性

C# Stub在具体类中但不在单元测试接口上的属性,c#,unit-testing,mocking,mef,rhino-mocks,C#,Unit Testing,Mocking,Mef,Rhino Mocks,我有一个比我的界面信息更多的类。它有一个我没有在接口中公开的属性 public interface IViewResolver { object GetViewFor(string viewName); } public class ViewResolver : IViewResolver { [ImportMany] public IEnumerable<Lazy<IView,IViewMetaData>> Views { get; s

我有一个比我的界面信息更多的类。它有一个我没有在接口中公开的属性

 public interface IViewResolver
{
    object GetViewFor(string viewName);

}
public class ViewResolver : IViewResolver
{


    [ImportMany]
    public IEnumerable<Lazy<IView,IViewMetaData>> Views { get; set; }



    public object GetViewFor(string viewName)
    {
        var view = Views.Where(x => x.Metadata.Name == viewName).FirstOrDefault();

        return view == null ? null : view.Value;
    }

}
现在我想基于该接口实现一个MefViewResolver

 public interface IViewResolver
{
    object GetViewFor(string viewName);

}
public class ViewResolver : IViewResolver
{


    [ImportMany]
    public IEnumerable<Lazy<IView,IViewMetaData>> Views { get; set; }



    public object GetViewFor(string viewName)
    {
        var view = Views.Where(x => x.Metadata.Name == viewName).FirstOrDefault();

        return view == null ? null : view.Value;
    }

}
公共类ViewResolver:IViewResolver
{
[进口数量]
公共IEnumerable视图{get;set;}
公共对象GetViewFor(字符串viewName)
{
var view=Views.Where(x=>x.Metadata.Name==viewName).FirstOrDefault();
返回视图==null?null:view.Value;
}
}
我的SUT在每个构造函数注入中获得一个IResolver,该构造函数注入加载了我的mefViewResolver。在我的单元测试中,我想从外部预先设置我的视图属性,而不使用mef或在我的界面中是mef特定的。 基本上,我想用期望值设置视图,看看使用IViewResolver的viewmodel是否返回预设视图。。。 即使我的界面上不存在views属性,我如何存根它

如果我走错了路。。。任何更正都是非常有益的


谢谢D.

如果您想测试您的ViewModel(而不是解析器),它只知道IViewResolver接口,那么您不应该有任何问题:ViewModel可以访问的唯一方法(根据提供的代码)是
GetViewFor
。您所需要做的就是为每个测试用例返回适当的视图,给定视图名称。在Rhinomock中,它应该类似于:

// Arrange the test objects
var viewResolverMock = MockRepository.GenerateMock<IViewResolver>();
viewResolverMock.Stub(x => x. GetViewFor(thisTestViewName).Return(thisTestView);
var myViewModel = new MyViewModel(viewResolverMock);

// Do the actual operation on your tested object (the view model)
var actualResult = myViewModel.DoSomethingWithTheView();

// Assert 
AssertAreEqual(expectedResult, actualResult);
//排列测试对象
var viewsolvermock=MockRepository.GenerateMock();
viewResolverMock.Stub(x=>x.GetViewFor(thisTestViewName).Return(thisTestView);
var myViewModel=新的myViewModel(viewsolvermock);
//对测试对象(视图模型)执行实际操作
var actualResult=myViewModel.doSomethingWithView();
//断言
资产等价(预期结果、实际结果);

您可能希望
存根
调用viewsolvermock.GetViewFor(…)而不是创建期望,因为它只是一个查询,并且您对MyViewModel.doSometingWithView()的结果有一个断言假设这取决于IViewResolver。感谢大家的提醒。我正在尝试一次测试2个思考。我应该独立测试我的mefviewresolver,并且应该依靠它在我的视图模型测试中工作。有了它,我可以毫无顾虑地将GetViewFor存根…再次感谢=)