2016-02-17 43 views
-2
public static void Mock(out IProgram prog, out IJson json) 
{  
    prog = Substitute.For<IProgram>(); 
    IJson = Substitute.For<IJson>(); 

    prog.SaveProg(1, 1, 1, "Somthing", 1, DateTime.UtcNow, 
       (DateTime.UtcNow + TimeSpan.FromDays(10)), 
       10, "[email protected]", DateTime.UtcNow, 1) 
     .Returns(ObjectResult<int?>); 
} 

由于ObjectResult是受保护的类,因此调用Returns(ObjectResult<int?>)时出现错误。我该如何解决这个问题,以便能够从实际方法中调用我的模拟方法?如何使用NSubstitute模拟受保护的方法

+0

感谢Arturo的编辑 –

+1

构成例子的问题是,如果你不检查它们,它们会比无意义的更糟糕。您可能希望解决的问题有很多问题。您提供的代码示例不会编译。 '.Returns'期待一个实例,而不是一个类型。你目前正在模拟接口,它不能有保护方法。 'ObjectResult '不是一个受保护的类(一个类需要嵌套才能被保护)。有不同版本的ObjectResult ,其中一些是密封的,其中一些具有受保护的构造函数。你想与哪个版本合作? – forsvarir

+0

你为什么在乎你不能看到的课程结果?你能否以ObjectResult 的结果进行测试,因此你不必触摸该类? –

回答

-1

您应该无法模拟受保护的类/方法。它受到明确的保护,所以你不能这样做。如果您需要嘲笑它,请将其公开。如果是别人的方法,而且你认为你需要嘲笑它,那么你可能测试不正确。

+1

我不能改变访问修饰符。除了我所知道的,你还有什么建议? –

+1

方法不可能被标记为受保护,以明确防止嘲讽/防止创建测试双打。在某些情况下,例如'ObjectResult '受保护的构造函数被特别添加以便于创建测试双打。 https://msdn.microsoft.com/en-us/library/mt154818(v=vs.113).aspx#M:System.Data.Entity.Core.Objects.ObjectResult'1。 – forsvarir

+0

如果你不应该嘲笑受保护的方法,那么为什么有'私人'和'保护'?这实际上是测试框架的限制,因为我可以扩展该类并模拟出受保护的方法。它应该有'虚拟',如果它真的打算被改变,但我仍然可以嘲笑它。做所有这些来创建测试双重结果会导致非常繁重的代码,我希望模拟框架能够减少。 –

相关问题