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

C# 测试方法返回一个带有Moq的字符串,c#,unit-testing,tdd,moq,C#,Unit Testing,Tdd,Moq,我有一个集成项目,我想测试。我有一个外部web服务,我想测试它是否返回字符串 我有一个IMyService接口,然后是一个实现-MyService 我正在尝试为这个项目编写单元测试,但以前从未做过任何TDD,我第一次尝试使用Moq 我要测试的方法具有以下签名: public string GetTicketId(Coordinate[] coordinates) 到目前为止,在我的ServiceTest类中,我有以下内容: [TestClass] public class MyService

我有一个集成项目,我想测试。我有一个外部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);
    }
[TestClass]
公共类MyServiceTest
{
[测试方法]
public void GetTicketId()
{
var mockMyService=new Mock();
变量坐标=新坐标[1];
对于(int i=0;in.GetTicketId(坐标)).Returns();
//Assert.IsNotNull(ticketId);
}

我有点被困在这里-将坐标传递给mockMyService的正确方法是什么?因此,我想断言的是,我从外部服务调用返回的字符串不是空的-也就是说,我从外部服务得到一个响应,你提到了集成测试,所以如果你只是想测试web服务正在返回字符串,您不需要Moq。只需按正常方式设置web服务,获得结果并执行以下操作:

var ws = new WebService();
var result = ws.GetTicketId(coordinates);

Assert.IsInstanceOf<ClassName>(result);
var ws=newwebservice();
var result=ws.GetTicketId(坐标);
Assert.IsInstanceOf(结果);
您也可以通过服务来实现这一点:

var service = new MyService();
var result = serice.GetTicketId(coordinates);

Assert.IsInstanceOf<ClassName>(result);
var service=newmyservice();
var结果=serice.GetTicketId(坐标);
Assert.IsInstanceOf(结果);
当您尝试测试特定的功能时,Moq开始发挥作用,并且该功能取决于一些外部连接,例如数据库或web服务

您可以针对执行该操作的接口设置Moq…假设您有一个名为“GetUser”的函数,该函数有一个名为“IUserRepository”的接口,您希望确保GetUser只调用函数repo.GetUser(id)一次…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);
    }
[TestMethod]
public void GetTicketId()
{
var mockMyService=new Mock();
mockMyService.Setup(n=>n.GetTicketId(It.IsAny))
.返回(“非空字符串”);
var objectUnderTest=新objectUnderTest(mockMyService);
var ticketId=objectUnderTest.GetTicketId();
Assert.IsNotNull(ticketId);
}
基本上,您可以设置伪项并将其传递到您正在测试的对象中。您不直接测试接口,而是测试正在使用该接口的东西。模拟的目的是避免命中外部资源(或者有些人可能会说,甚至命中的类比您正在测试的要多..但不走这条路很有说服力)