Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取NMock期望值以基于收到的参数返回新对象_C#_.net_Nmock - Fatal编程技术网

C# 获取NMock期望值以基于收到的参数返回新对象

C# 获取NMock期望值以基于收到的参数返回新对象,c#,.net,nmock,C#,.net,Nmock,NMock3是我选择的模拟框架,但我正努力让它实现我想要的 我需要的是根据满足期望时接收到的一些参数,构造一个新对象并作为期望的一部分返回 例如: var mockFactory = new MockFactory(); var mockA = mockFactory.CreateMock<ObjectA>(); mockA.Expects.One.Method(c => c.BuildObjectB(null)) .With(Is.TypeOf(typeof(string

NMock3是我选择的模拟框架,但我正努力让它实现我想要的

我需要的是根据满足期望时接收到的一些参数,构造一个新对象并作为期望的一部分返回

例如:

var mockFactory = new MockFactory();
var mockA = mockFactory.CreateMock<ObjectA>();
mockA.Expects.One.Method(c => c.BuildObjectB(null))
  .With(Is.TypeOf(typeof(string)))
  .WillReturn(new ObjectB(<?>));
var mockFactory=new mockFactory();
var mockA=mockFactory.CreateMock();
mockA.Expects.One.Method(c=>c.BuildObjectB(null))
.With(Is.TypeOf(TypeOf(string)))
.WillReturn(new ObjectB());
在WillReturn中更新ObjectB时,我如何访问期望收到的参数?对于NMock3,这可能吗


谢谢

我认为NMock3库不允许您这样做。文档非常稀少,但我已经浏览了NMock3,没有找到这样的文档

我不认为这是一件非常糟糕的事情。单元测试通常是确定性的,因此可以提前知道
字符串的值。单元测试是一个重复你自己是一件好事的地方。它使测试更简单,可读性更强。因此,在你的例子中,我会说,选择简单但完全可读的

var mockFactory = new MockFactory();
var mockA = mockFactory.CreateMock<ObjectA>();
mockA.Expects.One.Method(c => c.BuildObjectB("Frank")).WillReturn(new ObjectB("Frank"));
var mockFactory=new mockFactory();
var mockA=mockFactory.CreateMock();
mockA.Expects.One.Method(c=>c.BuildObjectB(“Frank”)).WillReturn(newObjectB(“Frank”);

我可以想到一些(罕见的)不确定的情况,例如,返回一个
DateTime
,而您事先不知道它将是哪一个。或者,该函数可能会使用不同的参数多次被调用。在这些情况下,您可以使用一个简单的存根来跟踪它被调用的次数。

我认为NMock3库不允许您这样做。文档非常稀少,但我已经浏览了NMock3,没有找到这样的文档

我不认为这是一件非常糟糕的事情。单元测试通常是确定性的,因此可以提前知道
字符串的值。单元测试是一个重复你自己是一件好事的地方。它使测试更简单,可读性更强。因此,在你的例子中,我会说,选择简单但完全可读的

var mockFactory = new MockFactory();
var mockA = mockFactory.CreateMock<ObjectA>();
mockA.Expects.One.Method(c => c.BuildObjectB("Frank")).WillReturn(new ObjectB("Frank"));
var mockFactory=new mockFactory();
var mockA=mockFactory.CreateMock();
mockA.Expects.One.Method(c=>c.BuildObjectB(“Frank”)).WillReturn(newObjectB(“Frank”);

我可以想到一些(罕见的)不确定的情况,例如,返回一个
DateTime
,而您事先不知道它将是哪一个。或者,该函数可能会使用不同的参数多次被调用。在这些情况下,您可以使用一个简单的存根来跟踪它被调用的次数。

您可以使用Collect.MethodArgument:

var mockFactory = new MockFactory();
var mockA = mockFactory.CreateMock<ObjectA>();
mockA.Expects.One.Method(c => c.BuildObjectB(null))
  .With(Is.TypeOf(typeof(string)))
  .WillReturn(Collect.MethodArgument<string>(0, delegate(string myString) { new ObjectB(myString); }));
var mockFactory=new mockFactory();
var mockA=mockFactory.CreateMock();
mockA.Expects.One.Method(c=>c.BuildObjectB(null))
.With(Is.TypeOf(TypeOf(string)))
.WillReturn(Collect.MethodArgument(0,委托(字符串myString){new ObjectB(myString);}));

您可以使用Collect.MethodArgument:

var mockFactory = new MockFactory();
var mockA = mockFactory.CreateMock<ObjectA>();
mockA.Expects.One.Method(c => c.BuildObjectB(null))
  .With(Is.TypeOf(typeof(string)))
  .WillReturn(Collect.MethodArgument<string>(0, delegate(string myString) { new ObjectB(myString); }));
var mockFactory=new mockFactory();
var mockA=mockFactory.CreateMock();
mockA.Expects.One.Method(c=>c.BuildObjectB(null))
.With(Is.TypeOf(TypeOf(string)))
.WillReturn(Collect.MethodArgument(0,委托(字符串myString){new ObjectB(myString);}));

您可以创建一个简单的存根,而不是courseI可以创建的存根,但是我更希望能够通过使用期望值来验证对BuildObjectB的调用只发生一次。这也让我感到,这不是一个特别牵强的用例,我确信我以前需要能够做到这一点。啊,我现在明白了,你想要构造
ObjectB(“Frank”)
?是的,但是在测试中没有硬编码构造函数的参数。你可以创建一个简单的存根,而不是courseI可以,但是我希望能够通过使用期望值来验证对BuildObjectB的调用只发生一次。这也让我感到这不是一个特别牵强的用例,我确信我以前需要能够做到这一点。啊,我现在明白了,你想要构造
ObjectB(“Frank”)
?是的,但在测试中没有对构造函数的参数进行硬编码。问题是字符串对象不是我会提前知道的东西,因为进行调用的对象在内部构建了一个对象,这正是我试图访问的对象。我更新了我的问题,希望能反映出这一点。问题是,字符串对象不是我会提前知道的东西,因为进行调用的对象在内部构建了一个对象,这就是我试图访问的对象。我更新了我的问题,希望能反映这一点。