【发布时间】: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