Unit testing Rhino Mock或StructureMap AutoMock如何在同一个/继承类中存根函数?

Unit testing Rhino Mock或StructureMap AutoMock如何在同一个/继承类中存根函数?,unit-testing,structuremap,rhino-mocks,automocking,Unit Testing,Structuremap,Rhino Mocks,Automocking,我正在测试一个数据访问类。基本上,函数1直接从DataContext读取数据,而另一个函数2添加过滤器。function1和function2可以在同一个类中,也可以在继承类中 我怎样才能存根函数1的返回值和测试函数2 示例代码我得到了这一点,但它不工作。我曾尝试使用Rhino Mock和StructureMap Auto Mock,但在使用存根时仍然会出错 感谢您的帮助。非常感谢 public class TestClass : ITestClass { private DbConte

我正在测试一个数据访问类。基本上,函数1直接从DataContext读取数据,而另一个函数2添加过滤器。function1和function2可以在同一个类中,也可以在继承类中

我怎样才能存根函数1的返回值和测试函数2

示例代码我得到了这一点,但它不工作。我曾尝试使用Rhino Mock和StructureMap Auto Mock,但在使用存根时仍然会出错

感谢您的帮助。非常感谢

public class TestClass : ITestClass
{
    private DbContext _context;

    public IEnumerable<TestObject1> TestFunction1()
    {
        return _context.GetSomething();
    }

    public TestObject2 TestFunction2()
    {
        return TestFunction1().Where(x=>x.Parent == null);
    }
}
public interface ITestClass
{
    IEnumerable<TestObject1> TestFunction1();
    TestObject2 TestFunction2();
}
[Test]
public void TestFunction2_Test()
{
    var mock = MockRepository.GenerateMock<TestClass>();

    var test = new List<TestObject1>();

    mock.Stub(x=>x.TestFunction1()).Return(test);

    var result = mock.TestFunction2();

    Assert.AreSame(1, result.Count());
}
公共类TestClass:ITestClass
{
私有DbContext _context;
公共IEnumerable TestFunction1()
{
返回_context.GetSomething();
}
公共TestObject2 TestFunction2()
{
返回TestFunction1(),其中(x=>x.Parent==null);
}
}
公共接口ITestClass
{
IEnumerable TestFunction1();
TestObject2 TestFunction2();
}
[测试]
public void TestFunction2_Test()
{
var mock=MockRepository.GenerateMock();
var test=新列表();
mock.Stub(x=>x.TestFunction1()).Return(test);
var result=mock.TestFunction2();
Assert.arame(1,result.Count());
}

要让它正常工作,您需要的是“部分模拟”。在执行部分模拟时,Rhino模拟只能存根虚拟方法。如果将
TestFunction1
标记为
virtual
,它应该可以工作

您还应该使用
Assert.AreEqual
,因为它检查值是否相等(“对象是否相等?”)
Assert.arame
检查引用相等性(“它们是同一对象吗?”)。有关详细说明,请参阅


对于一般的部分模拟,应避免。必须执行部分模拟通常表明类试图做得太多。要么将函数作为类的单元测试的一部分进行测试,要么将其提取到单独的协作类。

非常感谢您的评论,我昨晚测试了,让方法虚拟化。谢谢你指出同样的问题。