Tag: mocking

犀牛嘲笑部分模拟

我试图从一些现有的类测试逻辑。 由于它们非常复杂并且在生产中,因此不可能重新考虑目前的类别。 我想要做的是创建一个模拟对象并测试一个内部调用另一个非常难以模拟的方法的方法。 所以我想为次要方法调用设置一个行为。 但是当我设置方法的行为时,方法的代码被调用并失败。 我是否遗漏了某些东西,或者这是不可能在没有重新分类的情况下进行测试? 我已经尝试了所有不同的模拟类型(Strick,Stub,Dynamic,Partial等),但是当我尝试设置行为时,它们都会调用该方法。 using System; using MbUnit.Framework; using Rhino.Mocks; namespace MMBusinessObjects.Tests { [TestFixture] public class PartialMockExampleFixture { [Test] public void Simple_Partial_Mock_Test() { const string param = “anything”; //setup mocks MockRepository mocks = new MockRepository(); var mockTestClass = mocks.StrictMock(); //record beahviour *** actualy call into the real method stub *** Expect.Call(mockTestClass.MethodToMock(param)).Return(true); //never […]

如何使用NUnit模拟属性?

如何使用NUnit模拟属性? 注意 :我发现这个外围模拟答案非常有用,并将其作为一个独特的问答条目重新用于其他人,以供其他人查找。 其他答案也欢迎。 NUnit-Discuss注意: NUnit Mocks是在一个周末创建的玩具模拟实现[…]我开始认为这是一个错误,因为你远远不是第一个依赖它的人。 – http://groups.google.com/group/nunit-discuss/msg/55f5e59094e536dc (NUnit Mocks上的Charlie Pool)

存储库中的Moq – Linq表达式 – 在设置中指定表达式

我的界面上有一个方法,如下所示: T GetSingle(Expression<Func> criteria); 我正在尝试模拟这样的设置(我意识到这不起作用): _mockUserRepository = new Mock<IRepository>(); _mockUserRepository.Setup(c => c.GetSingle(x => x.EmailAddress == “a@b.com”)) .Returns(new User{EmailAddress = “a@b.com”}); 我意识到我将错误的参数传递给设置。 读完这个答案后,我可以通过传递Expression来实现它,就像这样: _mockUserRepository.Setup(c => c.GetSingle(It.IsAny<Expression<Func>>()) .Returns(new User{EmailAddress = “a@b.com”}); 但是,这意味着如果我使用任何表达式调用GetSingle方法,则返回相同的结果。 有没有办法在设置中指定要使用的表达式?

模拟方法的结果

我试图找到一种方法来伪造从另一个方法中调用的方法的结果。 我有一个“LoadData”方法,它调用一个单独的帮助器来获取一些数据,然后它将对其进行转换(我对测试转换后的结果感兴趣)。 所以我有这样的代码: public class MyClass(){ public void LoadData(){ SomeProperty = Helper.GetSomeData(); } public object SomeProperty {get;set;} } 我想从Helper.GetSomeData()方法得到一个已知的结果。 我可以使用一个模拟框架(我对Rhino Mocks的经验相当有限,但对任何事情都很开放)来强制实现预期的结果吗? 如果是这样,怎么样? *编辑 – 是的,如我所料,我无法实现我想要的黑客攻击,我将不得不找到一种更好的方法来设置数据。

使用文件IO的unit testing方法

我正在努力养成编写unit testing的习惯,我之前写过一些,但它们通常都很基础……我想开始转向TDD,因为我想提高质量我的代码(设计和结构) – 减少耦合,同时希望减少回归到可测试构建的回归数量。 我采取了一个相对简单的项目,我开始工作。 生成的程序监视文件夹,然后对该文件夹中的文件执行操作。 以下是从项目中提取的一些代码的典型示例: private string RestoreExtension(String file) { var unknownFile = Path.GetFileName(file); var ignoreDir = Path.GetDirectoryName(file) + “\\Unknown”; string newFile; //We need this library for determining mime if (CheckLibrary(“urlmon.dll”)) { AddLogLine(“Attempting to restore file extension”); var mime = GetMimeType(BufferFile(file, 256)); var extension = FileExtensions.FindExtension(mime); if (!String.IsNullOrEmpty(extension)) { AddLogLine(“Found extension: ” + […]

模拟IEnumerable 类型的GetEnumerator()方法

以下测试用例在rhino mocks中失败: [TestFixture] public class EnumeratorTest { [Test] public void Should_be_able_to_use_enumerator_more_than_once() { var numbers = MockRepository.GenerateStub(); numbers.Stub(x => x.GetEnumerator()).Return(new List { 1, 2, 3 }.GetEnumerator()); var sut = new ObjectThatUsesEnumerator(); var correctResult = sut.DoSomethingOverEnumerator2Times (numbers); Assert.IsTrue(correctResult); } } public class ObjectThatUsesEnumerator { public bool DoSomethingOverEnumerator2Times(INumbers numbers) { int sum1 = numbers.Sum(); // returns 6 int […]

模拟迭代行为

我有一个迭代行为的界面,我在Rhinomocks模拟它时遇到了麻烦。 示例接口和类是我的问题的一个非常简单的版本。 每次调用LineReader.Read()时,LineReader.CurrentLine()都应该返回一个不同的值 – 下一行。 到目前为止,我还没有能够在模拟中重现这种行为。 因此,它已成为我的一个小业余爱好项目,我不时回到这里。 我希望你能帮助我更进一步。 internal class LineReader : ILineReader { private readonly IList _lines; private int _countOfLines; private int _place; public LineReader(IList lines) { _lines = lines; _countOfLines = lines.Count; _place = 0; } public string CurrentLine() { if (_place<_countOfLines) { return _lines[_place]; } else { return null; } } public […]

嘲笑Guid.NewGuid()

假设我有以下实体: public class User { public int Id { get; set; } public string Username { get; set; } public Guid UserGuid { get; set; } public Guid ConfirmationGuid { get; set; } } 以下接口方法: void CreateUser(string username); 部分实现应该创建两个新的GUID:一个用于UserGuid ,另一个用于ConfirmationGuid 。 他们应该通过将值设置为Guid.NewGuid()来完成此操作。 我已经使用接口抽象了Guid.NewGuid(): public interface IGuidService { Guid NewGuid(); } 因此,当只需要一个新的GUID时,我可以轻松地模拟它。 但是我不确定如何在一个方法中模拟对同一方法的两个不同的调用,以便它们返回不同的值。

模拟对象没有Intellisense中显示的所有属性 – 在一个项目中但在另一个项目中有它们

我在嘲笑VSTO对象,在一个项目中(我没写),它有这样的代码: var listOfSheets = new List(); var mockSheets = Substitute.For(); mockSheets.Count.Returns(listOfSheets.Count); mockSheets的Intellisense ToolTip显示了6个属性: 具有断点的线在此项目中起作用。 但是我在不同的项目中使用相同的代码(相同的引用,名称空间等),但是mockSheets的Intellisense ToolTip只显示1个属性: 我知道这是我试图解决的根本原因,但实际问题是: 无法对空引用执行运行时绑定 编辑: Sheet对象被模拟: public static Worksheet Sheet { get { var mockSheet = Substitute.For(); mockSheet.Name = MockSheetName; mockSheet.Visible = XlSheetVisibility.xlSheetVisible; return mockSheet; } } public static Workbook Workbook() { return Workbook(1); }

如何创建一个文件来填充HttpContext.Current.Request.Files?

在我的Web API中,POST操作方法在服务器上上传文件。 对于unit testing此方法,我需要创建一个HttpContext并将一个文件放在其请求中: HttpContext.Current.Request.Files 到目前为止,我正在伪造HttpContext与这个完美的代码: HttpRequest request = new HttpRequest(“”, “http://localhost/”, “”); HttpResponse response = new HttpResponse(new StringWriter()); HttpContext.Current = new HttpContext(request, response); 请注意,我不想使用Moq或任何其他Mocking库。 我怎么能做到这一点? (多部分内容可能吗?) 谢谢