如何在单元测试中运行WebServices

本文关键字:运行 WebServices 单元测试 | 更新日期: 2023-09-27 18:00:17

我创建了一个函数来验证一些规则。只要列表中的一个元素与另一个列表中的元素匹配,该函数就应该返回bool。

这是规则类的相关代码

public override TestResult Execute()
{
      Instrument ins = (Items.Length > 0) ? Items[0] as Instrument : null;
      string errorInfo;
      if (ins == null)
      {
          Result.Message = "Unable to perform test";
          Result.Status = ResultStatus.Error;
          return Result;
      }
      if (MPICSupportDB(ins))
      {
          Result.Message = "DB not supported by MPIC";
          Result.Status = ResultStatus.Yellow;
      }
      else
      {
          Result.Status = ResultStatus.Green;
      }
      return Result;
}
private bool MPICSupportDB(Instrument ins)
{
    IServiceProviderFactory serviceFactory = new WebServiceProviderFactory();
    IInterfaceAssignmentService wService = serviceFactory.CreateInterfaceAssignmentService();
    InterfaceAssignment wAssignments = wService.LoadAssignmentGroup("R4");
    return ins.Connections.OfType<InterfaceConnection>()
                          .Where(conn => conn.Card.IsDB)
                          .Any(conn => wAssignments.PartMasters
                          .Any(partNumber => (conn.CardPartNumber == partNumber.PartNumber)));               
}

我正在尝试在单元测试中测试函数MPICSupportDB。到目前为止,我已经开始创建我的单元测试(如下(,但现在我迷路了,我不知道该怎么办

[TestMethod]
public void TestForcompatibleDB()
{
    var ins = new Instrument();
    var serviceFactoryMock = new Mock<IServiceProviderFactory>();
    var wserviceTest = new Mock<IInterfaceAssignmentService>();
    var wassagnementTest = new Mock<InterfaceAssignment>();
    // adding an MPIC card
    ins.Connections.Add(AddCard(CardType.MPIC, "MA505400612268", "CARD1", 0, ins));
    // adding an MPIC daughterboard
    ins.Connections.Add(AddCard(CardType.GPIM_DB, "MA335022012268", "DB1", 1, ins));

    var rule = new Rule026(RuleApplicability.Test, new object[] { ins });
    var result = rule.Execute();
    Assert.IsNotNull(result);
    Assert.AreEqual(ResultStatus.Green, result.Status);
}

问题是像WebservicefactoryService这样的类不能直接在单元测试中运行。

有人能向我解释一下如何正确地模拟这些对象并进行测试吗?

如何在单元测试中运行WebServices

您需要将IServiceProviderFactory提供给Rule026类,而不是在类中构造它。这将允许您使用您正在创建的Mock。最常见的方法是通过构造函数注入。您还没有为Rule类提供构造函数,但如果您将其修改为以下内容:

public Rule026(/*otherArgs*/, IServiceProviderFactory scpFactory = null) {
    if(null == scpFactory)
        scpFactory = new ServiceProviderFactory();
    }
    _serviceProviderFactory = scpFactory;
}

然后,您将能够从测试中注入工厂,而不必更新当前构建规则的所有代码。根据您的情况,移动到IOC容器以提供依赖项,或者删除默认值并强制客户端创建工厂以便能够实例化规则可能更可取。

一旦你可以传递你的mock,你只需要设置一个返回链,允许mock相互返回。类似于:

    var serviceFactoryMock = new Mock<IServiceProviderFactory>();
    var wserviceTest = new Mock<IInterfaceAssignmentService>();
    var wassagnementTest = new Mock<InterfaceAssignment>();
    serviceFactoryMock.Setup(x=>x.CreateInterfaceAssignmentService())
                      .Returns(wserviceTest.Object);
    wserviceTest.Setup(x=>x.CreateInterfaceAssignmentService())
                .Returns(wassagnementTest.Object);
    wassagnementTest.Setup(x=>x.LoadAssignmentGroup(It.IsAny<string>()))
                .Returns(cannedInterfaceAssignmentResponse);

然后在构建对象时提供模拟:

var rule = new Rule026(RuleApplicability.Test, 
                       new object[] { ins }, 
                       serviceFactoryMock.Object);

你可能还想在你的mock中添加验证等,这取决于你试图测试的内容和你的特定测试风格。