标签: fakeiteasy

如何检查FakeItEasy是否必须发生对任何过载的调用?

我有一个我正在测试的方法.给定某些输入,它应该向记录器(ILogger)写入失败方法.该接口有几个Log()重载,以及一些属性(例如日志记录级别).我正在使用FakeItEasy嘲笑记录器.

我想断言的是发生了对Log()的调用.但是,我不关心使用了哪个特定的重载.我怎样才能做到这一点?

我的想法:

// Doesn't work, since a different overload (with more parameters) is used.
A.CallTo(() => mockLogger.Log(null)).WithAnyArguments().MustHaveHappened();

// "Works", but if the code were to call something else on the logger
// (ex. change the logging level), this would also pass!
Any.CallTo(mockLogger).MustHaveHappened();
Run Code Online (Sandbox Code Playgroud)

c# unit-testing fakeiteasy

4
推荐指数
1
解决办法
3449
查看次数

使用FakeItEasy进行伪造方法调用会引发事件吗?

我正在努力做一些事情:

A.CallTo(() => fakeTimer.Start()).Invokes(() => 
    fakeTimer.Elapsed += Raise.With<ElapsedEventArgs>(ElapsedEventArgs.Empty).Now);
Run Code Online (Sandbox Code Playgroud)

根据这个答案,它fakeTimer是一个假的ITimer,一个包装器接口.

显然这不起作用,因为我无法在Experssion Tree中进行任务.

我实际上要实现的是Start在调用方法时模拟提升计时器事件.这样我就可以断言Start确实发生了一次调用.

任何(替代)想法?

编辑我是个白痴,错是我自己的!我不小心添加了一个额外的A.CallTo,我不应该.我没有删除这个问题,而是继续授予PatrikHägne他的合法声誉:)

c# mocking fakeiteasy

4
推荐指数
1
解决办法
1428
查看次数

创建假 DbDataAdapter 会抛出 FakeItEasy.Core.FakeCreationException

我在 Visual Studio 2010 中设置了一个简单的测试项目。对于单元测试,我使用 nunit 2.6.1 并模拟通过 NuGet 安装的 FakeItEasy 1.7.4582.63。

\n\n

我尝试使用以下代码伪造 DbDataAdapter:

\n\n
using System.Data.Common;\nusing FakeItEasy;\nusing NUnit.Framework;\n\nnamespace huhu\n{\n    [TestFixture]\n    public class Class1\n    {\n        [Test]\n        public void test1()\n        {\n            A.Fake<DbDataAdapter>();\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

当我使用 .NET Framework 3.5 运行测试时,一切正常并且 test1 将通过。但是,当我将框架版本设置为 .NET 4.0 时,出现以下异常:

\n\n
FakeItEasy.Core.FakeCreationException : \n  Failed to create fake of type "System.Data.Common.DbDataAdapter".\n\n  Below is a list of reasons for failure per attempted constructor:\n    No constructor arguments failed:\n      No default constructor was found on the type System.Data.Common.DbDataAdapter.\n …
Run Code Online (Sandbox Code Playgroud)

c# unit-testing fakeiteasy

4
推荐指数
1
解决办法
1890
查看次数

禁用FakeItEasy的AutoMocking

说我有一个界面

public interface IDatabase
{
  IObjectSet<Table1> Table1 {get;}

  IObjectSet<Table2> Table2 {get;}

  //goes on to around Table400
}
Run Code Online (Sandbox Code Playgroud)

所以当我用FakeItEasy创建一个实例时:

var fakeDb = A.Fake<IDatabase>();
Run Code Online (Sandbox Code Playgroud)

所有属性(表)都有一个默认的假值.我可以看到为什么这在大多数情况下都很方便,但在我的情况下,我需要所有这些null

这样做有一个聪明的方法吗?

c# unit-testing fakeiteasy

4
推荐指数
1
解决办法
326
查看次数

如何让FakeItEasy伪造对象的方法抛出第一次调用并返回第二次?

我有一个在foreach循环中多次调用的方法,每次都有相同的参数值.

foreach (var item in myCollection)
{
    // do some stuff with item
    // then...
    var result = _myService.Foo(aConstant, anotherConstant);
    // do something with result
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试编写一个测试,确保循环继续迭代,即使_myService.Foo()第一次抛出异常.

Moq中,我被允许将调用链接在一起Returns并且Throws如此:

mockService.Setup(x => x.Foo(aConstant, anotherConstant)).Throws<Exception>().Returns(someResult);
Run Code Online (Sandbox Code Playgroud)

这将导致调用Foo抛出异常,但所有后续调用都将返回someResult.我的主要目标是确保try/catch块包含在foreach块内的代码的后半部分,以便即使发生异常,循环也会继续.

foreach (var item in myCollection)
{
    // do some stuff with item
    // then...
    try
    {
        var result = _myService.Foo(aConstant, anotherConstant);
        // do something with result
    }
    catch (Exception e)
    {
        // ignore …
Run Code Online (Sandbox Code Playgroud)

c# exception moq mocking fakeiteasy

4
推荐指数
1
解决办法
3104
查看次数

使用 FakeItEasy 在方法中模拟方法

如何模拟/伪造另一个函数中调用的函数的结果?通常 Test2 将是一种我不喜欢获取真实数据的 DataAccess 方法。我喜欢我的单元测试测试的是业务逻辑。

这就是我现在所拥有的,但它根本不起作用。总和始终断言为 5!

public int Test1()
{
    var value = this.Test2(); //Unittest should substitute with 5
    var businesslogic = value + 10; //The business logic

    return businesslogic;
}

public int Test2()
{
    return 10; //I try to mock this value away in the test. Don´t go here!
}
Run Code Online (Sandbox Code Playgroud)

然后我有一个单元测试,我想在我的“业务逻辑”上运行。

[TestMethod()]
public void TestToTest()
{
//Arrange
var instance = A.Fake<IClassWithMethods>();

      //Make calling Test2 return 5 and not 10.
A.CallTo(() => instance.Test2()).Returns(5);

      //Call the method 
var sum = …
Run Code Online (Sandbox Code Playgroud)

c# unit-testing fakeiteasy

4
推荐指数
1
解决办法
6350
查看次数

带有FakeItEasy的.NET核心

可以FakeItEasy与.NET的核心工作?我已经通过NuGet安装了它,但我不能在项目中引用它,using FakeItEasy因为它找不到它.我已经检查了NuGet依赖项,我将其视为FakeItEasy (3.3.2)

.net fakeiteasy .net-core

4
推荐指数
1
解决办法
679
查看次数

FakeItEasy 为后续调用模拟方法返回不同的值

我在数学课上有一个名为 GetNumber() 的函数。我想在第一次调用时返回1 ,在第二次调用时返回2,依此类推。我在 Mockito 中做了这样的事情

when(mathObj.GetNumber()).thenReturn(1).thenReturn(2).thenReturn(3);
Run Code Online (Sandbox Code Playgroud)

我怎样才能用 FakeItEasy 做同样的事情

A.CallTo( () => mathObj.GetNumber()).Returns("")
Run Code Online (Sandbox Code Playgroud)

.net c# nunit fakeiteasy

4
推荐指数
1
解决办法
1420
查看次数

犀牛模仿'期待'与FakeItEasy

我有一个数据库操作对象作为我的UUT(被测单元)的依赖.因此,我想将它作为一个严格的模拟,因为我还想确保UUT不会调用任何其他可能导致db更改的方法.

在犀牛嘲笑中,我做了以下事情:

  1. 我从db对象做了一个严格的模拟
  2. 我在Arrange中制作了一个.Expect子句
  3. 我在Assert中调用了VerifyAllExpectations

但是,当我想在FakeItEasy中执行此操作时,我找不到如何在没有代码重复的情况下执行此操作.我尝试将CallsTo()+ MustHaveHappened()部分放入Arrange中,但之后我的测试失败了.如果我把CallsTo()+ MustHaveHappened()部分放在Assert中,那么我的测试也会失败,因为意外调用了严格的假.可以在不将CallsTo调用同时放入Arrange和Assert的情况下完成吗?

c# unit-testing rhino-mocks fakeiteasy

3
推荐指数
2
解决办法
372
查看次数

FakeItEasy - 有一个假接口继承自抽象,同时共享相同的接口继承

我有一个界面

public interface IInterface { void DoSomething(); }
Run Code Online (Sandbox Code Playgroud)

另一个接口

public interface IOtherInterface : IInterface { }
Run Code Online (Sandbox Code Playgroud)

抽象类

public abstract class AbstractClass : IInterface
{
    public void DoSomething()
    {
        Console.WriteLine("Got here");
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在编写一个单元测试和假 IotherInterface。抽象类已经包含我想要用于单元测试的有用方法。我将如何A.Fake<IOtherInterface>();继承AbstractClass

这是我到目前为止所尝试过的,但它不起作用 - AbstractClass.DoSomething 没有被击中。

        IOtherInterface fake = A.Fake<IOtherInterface>(builder => builder.Implements(typeof (AbstractClass)));

        fake.DoSomething();
Run Code Online (Sandbox Code Playgroud)

当然,如果我制作一个像这样的代理:

        var abstractFake = A.Fake<AbstractClass>();
        A.CallTo(() => fake.DoSomething()).Invokes(abstractFake.DoSomething);

        fake.DoSomething();
Run Code Online (Sandbox Code Playgroud)

...事情按我想要的方式进行。是否有内置机制可以实现此目的,以便我不需要该代理abstractFake对象?

更新

我需要IOtherInterface,因为我有一个客户端类需要 IotherInterface 作为依赖项:

class Consumer
{
    public Consumer(IOtherInterface otherInterface)
    {
        otherInterface.DoSomething();
    }
}
Run Code Online (Sandbox Code Playgroud)

c# unit-testing mocking fakeiteasy

3
推荐指数
1
解决办法
3546
查看次数

标签 统计

fakeiteasy ×10

c# ×9

unit-testing ×6

mocking ×3

.net ×2

.net-core ×1

exception ×1

moq ×1

nunit ×1

rhino-mocks ×1