Bry*_*her 2 c# unit-testing rhino-mocks mocking machine.fakes
我用Machine.Fakes打了一个僵局.我无法弄清楚如何仅out使用Machine.Fakes设备模拟参数.由于RhinoMocks 中存在错误,我将mfakes适配器切换为FakeItEasy.据我所知,任何适配器都应该是可互换的.
问题是这导致"out"测试失败,看起来像这样的东西不再编译,因为Arg是Rhino.Mocks.
The<IMembershipService>()
.WhenToldTo(x => x.CreateUser(Param<string>.IsAnything,
Param<bool>.IsAnything,
Param<object>.IsAnything,
out Arg<MembershipCreateStatus>
.Out(MembershipCreateStatus.UserRejected)
.Dummy))
.Return(user);
Run Code Online (Sandbox Code Playgroud)
我尝试使用"虚拟"局部变量,设置为原始Arg<T>参数设置的相同值,但这导致我的测试失败 - 好像值没有被传递! Arg<T>真的有解决方案,但我不能再使用它了,因为它是Rhino.Mocks的一部分.
小智 7
Machine.Fakes不处理这种情况.它根本没有实现.
我个人不使用参数和(如果我真的需要返回多个返回值)使用元组(Tuple <T,K>)或自定义类来表示这种情况.这就是为什么我从来没有真正重视我的优先事项.
我没有研究过,但是在Machine.Fakes中实现ref和out参数的处理可能是不可行的.在几个模拟框架之上实现包装器的挑战之一是,为了成功,所有模拟框架都需要在它们的工作方式上有一个共同点.Machine.Fakes现在也不支持模拟事件,因为我无法找到所有这些事件的共同点(仅限两个NSubstitute/FakeItEasy vs Rhino/Moq).
在我看来,你目前有两个选择:
抱歉没有给你更好的答案;-)
在这种情况下,您需要直接使用FakeItEasy.我认为问题在于FakeItEasy如何out通过附加AssignsOutAndRefParameters伪对象调用规范来设置参数的方式.这应该不是问题,因为Machine.Fakes所做的就是将其转换WhenToldTo为使用的伪造框架的适当API.
using FakeItEasy;
using Machine.Fakes;
using Machine.Specifications;
namespace MSpecMFakesOutParam
{
public interface IFoo
{
void Foo(out int foo);
}
public class When_using_FakeItEasy_with_out_params : WithFakes
{
static IFoo Foo;
static int Out;
Establish context = () =>
{
Foo = An<IFoo>();
var ignored = A<int>.Ignored;
A.CallTo(() => Foo.Foo(out ignored)).AssignsOutAndRefParameters(42);
};
Because of = () => Foo.Foo(out Out);
It should_assign_the_out_param =
() => Out.ShouldEqual(42);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1757 次 |
| 最近记录: |