2009-09-27 22 views
0
[Test] 
public void TestUserProfileInsert() 
{ 
    using (new TestBindingsWrapper("TestBindings", "", new TestModule())) 
    { 
    // Setup the mock the dataprovider 
    MyMocks.MockDataProvider.Setup(x => x.InsertUserProfile(It.IsAny<IUserProfile>())).Returns(1); 

    IUserProfile up = new UserProfile(); 

    IUserProfileManager manager = new UserProfileManager(); 
    int result = manager.Insert(up); 
    Assert.AreEqual(1, result); 
    MyMocks.MockDataProvider.Verify(x => x.InsertUserProfile(up), Times.Once()); 
    } 
} 

我也在用ninject。看起来,因为我设置了返回值,真正被测试的是这个笑话还是我错过了什么?这个mbunit测试真的有意义吗?

+0

你为什么不调用Ninject'Get'方法来激活你的对象? – 2009-10-28 14:52:59

回答

0

它正在测试manager.Insert(上)返回1,我猜是成功(或失败的预期返回代码。然后,我会假设最后一行是验证您提供的模拟对象有一个它基本上测试以确保UserProfileManager正确地传递和使用您提供的数据提供者的数据。

注意:要使此测试更好,我会建议让模拟返回7,然后验证7 UserProfileManager对象只返回7,表示它一直返回1

+0

但它会插入到数据库?该插入返回新插入的对象的ID。该ID是来自数据库的PK列。 – user179764 2009-09-27 15:44:47

+0

在这个例子中,我几乎可以确定1是来自模拟对象的返回。如果你需要了解更多,你应该去和你一起工作的人谈谈,他们知道Mock是如何工作的。我们不能神奇地告诉你公司的测试框架是如何建立的。 – tster 2009-09-27 15:49:02

0

在编写测试时,您的冷杉不希望它执行代码以期望的方式失败(新代码的预期功能或当前行为)。 只有在那之后你是否制作你的代码或修改测试才能让事情通过。所以,如果这是你关于这个测试的主要问题,我建议你退后一步,问自己你真正想要测试什么。

您发布的代码更像是Integration Test,而不是Unit Test,您试图去做什么?你的意见建议你担心插入数据库,,但你嘲笑一些对象。如果是单元测试,我很惊讶地看到你正在手动初始化这么多的具体对象(例如UserProfileManager)。 MockDataProvider实际上在哪里进入执行路径?