测试方法返回一个带有Moq的字符串

本文关键字:Moq 字符串 一个 返回 测试方法 | 更新日期: 2023-09-27 18:01:26

我有一个集成项目,我想测试。我有一个外部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的正确方法是什么所以我想要能够断言的是,我从外部服务调用返回的字符串不是空的-即我从外部服务

测试方法返回一个带有Moq的字符串

得到响应

听起来你想要这样做:

    [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的演讲很有说服力,让我们不要走上这条路)。

您提到了集成测试,所以如果您只是想测试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/