Tag: moq

Moq:无法转换为界面

我今天早些时候问过这个问题 。 因此,由于moq从一个接口创建它自己的类,我无法将它转换为另一个类。 所以它让我想知道如果我创建了一个ICustomPrincipal并尝试强制转换它。 这是我的嘲笑的样子: var MockHttpContext = new Mock(); var MockPrincipal = new Mock(); MockHttpContext.SetupGet(h => h.User).Returns(MockPrincipal.Object); 在我试图测试以下代码的方法给出错误(再次): var user = (ICustomPrincipal)httpContext.User; 错误如下: Unable to cast object of type ‘IPrincipalProxy4081807111564298854aabfc890edcc8’ to type ‘MyProject.Web.ICustomPrincipal’. 我想我仍然需要接口和moq的一些练习,但我不应该把moq创建的类转换回ICustomPrincipal? 我知道httpContext.User会返回一个IPrincipal,所以可能会丢失一些东西吗? 好吧,如果有人可以帮助我,我会很感激。 Pickels 编辑: 根据要求,我正在测试的方法的完整代码。 它仍然没有完成,但这是我到目前为止: public bool AuthorizeCore(HttpContextBase httpContext) { if (httpContext == null) { throw new ArgumentNullException(“httpContext”); } […]

运行测试时,HttpResponseBase.Headers为空

我正在使用Moq创建一个Mock来测试我正在为我的MVC2应用程序创建的FileResult 。 在FileResult的WriteFile(HttpResponseBase response)方法中,我在最后有以下代码: // Write the final output with specific encoding. response.OutputStream.Write(output, 0, output.Length); response.AppendHeader(“Content-Encoding”, encoding); 它将使用utf-8或gzip具体取决于请求的Accept-Encoding标头中Accept-Encoding 。 那么在我的测试中,我设置了我的Mock如下所示: var mockResponse = new Mock(); mockResponse.Setup(r => r.OutputStream).Returns(new MemoryStream()); mockResponse.Setup(r => r.Headers).Returns(new NameValueCollection()); 但是,当我实际检查标头已设置时, Content-Encoding 始终返回null: var response = mockResponse.Object; Assert.AreEqual(“utf-8”, response.Headers[“Content-Encoding”]); 奇怪的是,OutputStream获取写入它的数据,我可以声明它正在写入正确的值。 奇怪的是,当我实际调试Web项目中的FileResult时,标头被正确发送。 有没有人对此有所了解? 如有必要,我可以提供更多代码。

我可以使用Moq集成在UnitTests中访问Autofac的全部function吗?

我的项目(建立在Orchard之上,虽然我认为不相关)使用Autofac 。 我正在编写unit testing,我希望使用Moq来删除任何依赖项,并且我正在使用Autofac / Moq集成来实现这一点。 这适用于作为构造函数参数传递的任何简单依赖项。 (Autofac文档提供了有关如何实现此目的的详细信息)。 但是因为我没有使用containerBuilder,所以我看不到如何使用很多Autofac的function – lamda注册 , 注册generics ,标记要自动连接的属性。 等等 我错了,它可以以某种方式访问​​? 由于场景的一些固有约束,这些东西是不可用的吗? 是否有可能,尚未在此Autofac / Moq集成中实现(尚未)? 有好的工作吗?

对等待的模拟对象的异步回调

我试图模拟unit testing的复杂情况: _mockController = new Mock(); _mockController.Setup(tc => tc.Interrupt(It.IsAny<Func>())) .Callback<Func>(async f => await f.Invoke()); IController有一个void方法Interrupt(Func> f) ,它将一些工作排​​队。 我正在测试的对象会调用Interrupt() ,我可以像这样validation调用: _mockController.Verify(tc => tc.Interrupt(It.IsAny<Func>()), Times.Once); …但是当在回调中调用参数Func ,在Task不遵守await关键字:在Task完成之前继续执行测试(尽管在回调中await )。 其中一个症状是在Interrupt() Task参数中添加await Task.Delay(1000)会将通过的测试转换为失败的测试。 这种行为是由于测试期间如何处理线程或Task的细微差别? 或Moq的限制? 我的测试方法有这个签名: [Test] public async Task Test_Name() { }

模拟索引属性

我正在使用Moq编写unit testing。 我创建了一个模拟对象。 现在,当我尝试模拟其属性时,我收到错误“表达式树可能不包含索引属性” 这是我的代码。 public Node GetNode(IMyInterface interface, string itemName) { return interface.Items[itemName]; } 这是unit testing var expected = new Node(); var itemName = “TestName”; var mock = new Mock(); mock.Setup(f => f.Items[itemName]).Returns(expected); var target = new MyClass(); var actual = target.GetNode(mock.Object, itemName); Assert.AreEqual(expected, actual); 这条线给了我错误。 mock.Setup(f => f.Items[itemName]).Returns(expected); 我怎么能这个function。

moq只有一个类中的一个方法

我正在使用moq.dll当我模拟一个类(所有IRepository接口)时,我使用这个行代码 int state = 5; var rep = new Mock(); rep.Setup(x => x.SaveState(state)).Returns(true); IRepository repository = rep.Object; 但在这种情况下,我模拟了存储库类中的所有函数。 然后,类库中的所有方法都被Mock dll的方法设置所取代 我想使用类库中定义的所有方法(真正的类)并且只模拟一个函数(SaveState) 我怎样才能做到这一点? 有可能吗?

我可以使用moq的InSequence()和MockBehavior.Loose吗?

我试图执行后续的调用validation,我发现moq支持InSequence()方法,如: MockSequence s = new MockSequence(); validator.InSequence(s).Setup(m => m.IsValid(It.IsAny())).Returns(true); encryptor.InSequence(s).Setup(m=>m.Encrypt(It.IsAny())); socket.InSequence(s).Setup(m => m.Send(It.IsAny())); compressor.InSequence(s).Setup(m => m.Compress(It.IsAny())); 但是,这似乎只有在我将模拟行为指定为“严格”时才有效,这禁止我在模拟对象上调用其他方法。 但是,我希望能够在这些对象上调用其他方法,我只是希望这些调用按顺序执行。 是否有任何“支持”的方式(而不是诉诸.Callback()和手工实现)? 我找到了一个名为moq.sequence的附加库,但是,预编译版本不适用于最新的Moq。

如何使用Moq库创建SerialPort模拟?

我必须写很多处理串口的代码。 通常会在电线的另一端连接一个设备,我通常会创建自己的模拟来模拟它们的行为。 我开始关注Moq以帮助进行unit testing。 当你只需要一个存根时,使用它非常简单,但我想知道它是否可行,如果是,我如何为硬件设备创建一个模拟器,根据我想测试的内容做出不同的响应。 一个简单的例子: 我与之接口的设备之一接收命令(移动到位置x),返回ACK消息并进入“移动”状态,直到它到达有序位置。 我想创建一个测试,我发送移动命令,然后继续查询状态,直到它到达最终位置。 我想为两个不同的测试创建两个版本的模拟,一个是我希望设备成功到达最终位置,另一个是失败。 要问的问题太多了?

使用Moq存根接口方法

可能重复: 如何模拟使用MOQ返回int的方法 这是我的界面: public interface ICalenderService { DateTime Adjust(DateTime dateToAdjust, BusinessDayConvention convention, List holidayCities); } 我做了一些研究,似乎你可以很容易地模拟这个,但我想用Moq将其存根,这样我就可以将存根传递给我的其他类构造器并让存根返回我想要的任何DateTime用于其Adjust方法。 最简单的方法是什么? 编辑:我知道我可以在我的项目中创建自己的存根,但我想编写更少的代码,我认为Moq可以让我这样做,我只是不知道语法是什么样的。

如何使用Moq修改模拟方法的调用参数?

是否可以修改模拟方法的调用参数? 特别是我希望将以下示例中的buffer更改为预先填充的字节数组。 例: int MockedClass.Read(byte[] buffer, int offset, int count) 说明: 调用Read会将从offset Read字节count提供的字节数组buffer 。 现在我希望在我的应用程序代码中调用Read之后填充缓冲区。 那可能吗? 如果是的话,我将如何进行连续的Read调用? 如果可能的话,我希望连续调用每次都返回一个不同的缓冲区。 编辑: 使用Setup命令,如下所示: MockedClass.Setup(x => x.Read(It.IsAny(), It.IsAny(), It.IsAny()).Callback( (byte[] buffer, int offset, int count) => buffer[0] = 0xAA); 在执行unit testing时给出了一个奇怪的问题:一旦调用Read并执行委托代码( buffer[0] = 0xAA ),调试器就会显示buffer实际上为null并且执行此命令后unit testing执行停止。 我的语法是borked还是那个bug?