【问题标题】:Test method returns a string with Moq测试方法返回一个带有 Moq 的字符串
【发布时间】:2014-05-02 15:17:01
【问题描述】:

我有一个想要测试的集成项目。我有一个外部 Web 服务,我想测试它是否返回一个字符串。

我有一个 IMyService 接口,然后是一个实现 - MyService。

我正在尝试为这个项目编写单元测试,但之前从未做过任何 TDD,我是第一次尝试使用 Moq。

我要测试的方法具有以下签名:

 public string GetTicketId(Coordinate[] coordinates)

到目前为止,在我的 ServiceTest 课程中,我有以下内容:

[TestClass]
public class MyServiceTest
{
    [TestMethod]
    public void GetTicketId()
    {
        var mockMyService = new Mock<IMyService>();

        var coordinates = new Coordinate[1];

        for (int i = 0; i < coordinates.Length; i++)
        {
            var coord1 = new Coordinate { Id = i.ToString(), X = -110.5322, Y = 35.2108, QualityIndex = 90 };
            coordinates[i] = coord1;
        }

        //mockMyService.Setup(n => n.GetTicketId(coordinates)).Returns();

        //Assert.IsNotNull(ticketId);
    }

我有点卡在这里 - 将坐标传递给 mockMyService 的正确方法是什么所以我想要能够断言的是我从外部服务调用返回的字符串不为空 -即我得到外部服务的响应

【问题讨论】:

    标签: c# unit-testing tdd moq


    【解决方案1】:

    听起来你想要这样的东西:

        [TestMethod]
        public void GetTicketId()
        {
            var mockMyService = new Mock<IMyService>();
            mockMyService.Setup(n => n.GetTicketId(It.IsAny<Coordinate[]>))
                         .Returns("Not Null String");
            var objectUnderTest = new ObjectUnderTest(mockMyService);
    
            var ticketId = objectUnderTest.GetTicketId();
    
            Assert.IsNotNull(ticketId);
        }
    

    基本上,您设置了假项目并将其传递到您正在测试的对象中。您不直接测试接口,而是测试正在使用该接口的东西。嘲笑的目的是避免触及外部资源(或者有些人可能会说,甚至比你正在测试的课程还要多……但Ian Cooper's talk 有说服力不要走这条路)。

    【讨论】:

      【解决方案2】:

      您提到了集成测试,因此如果您只是想测试 Web 服务是否返回字符串,则不需要 Moq。只需像往常一样设置 Web 服务,获取结果并执行以下操作:

      var ws = new WebService();
      var result = ws.GetTicketId(coordinates);
      
      Assert.IsInstanceOf<ClassName>(result);
      

      您也可以使用该服务来做到这一点:

      var service = new MyService();
      var result = serice.GetTicketId(coordinates);
      
      Assert.IsInstanceOf<ClassName>(result);
      

      当您尝试测试特定功能并且该功能取决于某些外部连接(例如数据库或 Web 服务)时,Moq 就会发挥作用。

      您将针对执行该操作的接口设置 Moq...假设您有一个名为“GetUser”的函数,它有一个名为“IUserRepository”的接口,并且您想确保 GetUser 只调用函数 repo .GetUser(id) 一次... Moq 让您可以很好地做到这一点。

      我自己以前并不了解整个哲学,但一旦我真正明白了,我就开始喜欢它。真正吸引我的资源是 Roy Osherove 的视频:http://artofunittesting.com/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多