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。似乎因为我正在设置返回值,真正在测试什么,这是一个笑话还是我遗漏了什么?

4

2 回答 2

0

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

你发布的代码闻起来更像是一个集成测试而不是一个单元测试,你想做什么?您的评论表明您担心插入数据库,但您正在模拟一些对象。如果是单元测试,我很惊讶地看到您手动初始化了这么多具体对象(例如 UserProfileManager)。您实际在哪里MockDataProvider进入执行路径?

于 2009-10-28T14:53:48.107 回答
0

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

注意:为了使这个测试更好,我建议让模拟返回 7,然后验证是否返回了 7。UserProfileManager 对象仅返回 7 的可能性较低,它一直返回 1。

于 2009-09-27T15:20:34.460 回答