试图模拟一个方法,在C#中将商店代码添加到数据库

时间:2014-02-05 06:49:36

标签: c# unit-testing moq

我是嘲笑的新手,我对OOP概念有基本的了解。 接口中有一个方法可以将子存储代码添加到数据库中。 这个方法实现在我想要模拟的另一个类文件中。以下是方法。

public SubStore AddSubStoreCode(SubStore subStoreCode)
        {
            db.SubStores.Add(subStoreCode);
            SaveStoreCodes();
            return subStoreCode;
        }

在测试类文件中,我设置了模拟对象和要处理的方法。我不知道如何继续该行为并断言部分完成Moq单元测试。以下是摘录

 [TestMethod]
        public void ShouldBeAbleToAddSubStoreCode()
        {
            //Arrange
            var mockStoreCodeService = new Mock<IStoreCodeService>();

            mockStoreCodeService.Setup(s => s.AddSubStoreCode(It.IsAny<SubStore>));


        }

请告知

2 个答案:

答案 0 :(得分:1)

IStoreCodeServiceAddSubStoreCode是您正在测试的组件的依赖关系。您的测试缺少最重要的部分 - 正在测试的系统(到目前为止,您只是实例化并设置了依赖项)。

[TestMethod]
public void SomeMethod_ShouldAddSubStoreCode_ThroughService()
{
    // Arrange:
    // - create dependency and create instance of system under test (sut)
    // - we don't need mock.Setup here; verification is made at the end
    var mockStoreCodeService = new Mock<IStoreCodeService>();
    var sut = new SomeComponent(mockStoreCodeService);

    // Act: execute method on sut
    sut.SomeMethod();

    // Assert: verify expectations (that call has been made to service)
    mockStoreCodeService.Verify(m => m.AddSubStoreCode(It.IsAny<SubStore>));
}

我们跳过了mock.Setup因为在这样的测试中不需要它(我们验证我们的组件是否与其他组件通信;就像这里的情况一样)。

答案 1 :(得分:0)

请检查此链接。它对嘲弄有非常有用的解释。它可能会帮助你:
http://www.codeproject.com/Articles/30381/Introduction-to-Mocking

首先,您应该设置模拟存储库

private MockRepository _mocks;

[SetUp]
    public void initialize()
    {
        _mocks = new MockRepository();            
    }

然后设定期望你应该这样做:

using (_mocks.Record())
{
    SetupResult.For(averageJoeService.Authenticate(null,
        null)).IgnoreArguments().Return(true); 

}

其中Authenticate是您希望在其案例中将其设为AddSubStoreCode

的函数

期待之后

The next part is the Playback which is the code that will trigger the expectations and produce the desired result. Here is the Playback part:
 using (_mocks.Playback())
{
    Assert.AreEqual(100,_accountBalanceService.GetAccountBalanceByUser(user)); 
}

GetAccountBalanceByUser是您要用来完成测试的第二个函数。