我有一个我正在测试的方法.给定某些输入,它应该向记录器(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) 我正在努力做一些事情:
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他的合法声誉:)
我在 Visual Studio 2010 中设置了一个简单的测试项目。对于单元测试,我使用 nunit 2.6.1 并模拟通过 NuGet 安装的 FakeItEasy 1.7.4582.63。
\n\n我尝试使用以下代码伪造 DbDataAdapter:
\n\nusing 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\nFakeItEasy.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) 说我有一个界面
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
这样做有一个聪明的方法吗?
我有一个在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) 如何模拟/伪造另一个函数中调用的函数的结果?通常 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) 可以FakeItEasy与.NET的核心工作?我已经通过NuGet安装了它,但我不能在项目中引用它,using FakeItEasy
因为它找不到它.我已经检查了NuGet依赖项,我将其视为FakeItEasy (3.3.2)
我在数学课上有一个名为 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) 我有一个数据库操作对象作为我的UUT(被测单元)的依赖.因此,我想将它作为一个严格的模拟,因为我还想确保UUT不会调用任何其他可能导致db更改的方法.
在犀牛嘲笑中,我做了以下事情:
但是,当我想在FakeItEasy中执行此操作时,我找不到如何在没有代码重复的情况下执行此操作.我尝试将CallsTo()+ MustHaveHappened()部分放入Arrange中,但之后我的测试失败了.如果我把CallsTo()+ MustHaveHappened()部分放在Assert中,那么我的测试也会失败,因为意外调用了严格的假.可以在不将CallsTo调用同时放入Arrange和Assert的情况下完成吗?
我有一个界面
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) fakeiteasy ×10
c# ×9
unit-testing ×6
mocking ×3
.net ×2
.net-core ×1
exception ×1
moq ×1
nunit ×1
rhino-mocks ×1