Test方法返回一个带Moq的字符串

时间:2014-05-02 15:17:02

标签: c# unit-testing tdd moq

我有一个我希望测试的Integration项目。我有一个外部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的正确方法是什么,所以我想要断言的是我从外部服务调用中获取的字符串不为空 - 即我收到外部服务的回复

2 个答案:

答案 0 :(得分: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具有说服力,不会走这条路。)

答案 1 :(得分:0)

您提到集成测试,因此如果您只想测试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);

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

您可以针对执行该操作的接口设置Moq ...假设您有一个名为“GetUser”的函数,它具有一个名为“IUserRepository”的接口,并且您希望确保GetUser仅调用函数repo .GetUser(id)曾经...... Moq让你做得很好。

我过去常常不了解整个哲学,但是一旦我真正理解了它,我开始喜欢它。真正吸引我的资源是来自Roy Osherove的视频:http://artofunittesting.com/