【问题标题】:Rhino Mocks - Arg<T> to ommit some parametersRhino Mocks - Arg<T> 省略一些参数
【发布时间】:2016-05-06 21:12:39
【问题描述】:

我正在使用 Rhino Mocks 来排除 SOAP 端点的功能,并且大部分情况下它都可以工作。但是,界面非常古怪,我正在努力让以下工作(为了简单起见,我重命名了类)

  public interface IWebService
    {
        void CopyFile(Request request);
    }

public interface IService
{
    void CopyFile(string filename, byte[] data);
}

public class Request
{
    public string Filename { get; set; }
    public byte[] Data { get; set; }
}
public class Service : IService
{
    IWebService _service;
    public Service(IWebService service)
    {
        _service = service;
    }
    public void CopyFile(string filename, byte[] data)
    {
        _service.CopyFile(new Request() {Filename = filename,Data = data });
    }
}

现在,在我的测试中,我有这样的东西

[TestCase]
        public void TestFileCopyFailsIfFilenameIsMissing()
        {
            IWebService serviceMock = MockRepository.GenerateMock<IWebService>();
            serviceMock.Expect(x => x.CopyFile(Arg<Request>.Is.Equal(new Request() { Filename = Arg<string>.Is.Null, Data = Arg<byte[]>.Is.Anything }))).Throw(new Exception());

            Service service = new Service(serviceMock);
            service.CopyFile(null, new byte[] { });

        }

抛出异常: Rhino.Mocks.dll 中出现“System.InvalidOperationException”类型的异常,但未在用户代码中处理

附加信息:录制时仅在模拟方法调用中使用 Arg。预期 1 个参数,已定义 3 个。

我已经在这个上尝试了世界上所有的可能性,但无法做到这一点。如果我不使用 Arg 并使用

Expect(null, new byte[]{});

无论如何都会过去的

【问题讨论】:

  • 我认为你必须覆盖 Reqeust 中的 Equals 方法才能使其工作......或者你必须单独比较文件名和数据而不是整个请求
  • 嗨,Viru,我无法覆盖 Request,因为它是在每次构建 Web 服务时由工具自动生成的,而且我不是 Web 界面的供应商。还有什么可以做的吗?
  • 您是否能够通过类似于此 Arg.FileName 的操作来访问 FileName 和 Data 属性?想法是如果您能够访问特定属性,然后比较它们而不是整个请求
  • 我必须将 Request 类型传递给 Web 服务调用,所以当时我不能将其分解
  • Rhino Mock 是否为您提供了在运行测试时访问传递参数的属性的方法...这是您应该寻找的。​​span>

标签: c# unit-testing arguments parameter-passing rhino-mocks


【解决方案1】:

我建议使用WhenCalled 并在此方法中检查Request 对象。

        bool isCorrectParam = false;

        IWebService serviceMock = MockRepository.GenerateMock<IWebService>();
          serviceMock.Expect(x => x.CopyFile(null))
              .IgnoreArguments()
              .WhenCalled(x =>
              {
                  Request req = x.Arguments[0] as Request;
                  if (req.Data.Count() == 0 && req.Filename == null)
                  {
                      isCorrectParam = true;
                  }
              });

        Service service = new Service(serviceMock);
        service.CopyFile(null, new byte[] { });

        Assert.IsTrue(isCorrectParam);

【讨论】:

    【解决方案2】:

    你也可以使用 Matches...

    serviceMock.Expect(x => x.CopyFile(Arg<Request>.Matches(r => r.FileName==null))).Throw(new Exception());
    

    【讨论】:

    • 很高兴我能帮上忙...如果您接受答案,那就太好了:)
    • 请原谅我的能力不足,但我实际上正在寻找如何接受它但似乎找不到它。没那么有经验在这里提问
    • 就在投票选项下方反对我的答案会有勾选选项....检查这个meta.stackexchange.com/questions/23138/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多