Tag: fakeiteasy

使用FakeItEasy,是否可以创建一个采用generics类型参数的虚拟对象

我有以下测试: [Fact] public void StartProgram_CallsZoneProgramStart() { var zone = A.Fake(); zone.StartProgram(); A.CallTo(() => zone.ZoneProgram.Start(null, A.Dummy<ActionBlock>())).MustHaveHappened(Repeated.Exactly.Once); } 它正在创建一个ActionBlock类型的虚拟对象,它被传递给MustHaveHappened调用。 zone.StartProgram肯定会调用zone.ZoneProgram.Start方法,但FakeItEasy看不到此调用。 它返回以下错误消息: Assertion failed for the following call: ZoneLighting.ZoneProgramNS.ZoneProgram.Start(, ActionBlock\`1 Id=1) Expected to find it exactly once but found it #0 times among the calls: 1: ZoneLighting.ZoneProgramNS.ZoneProgram.Start(inputStartingValues: Faked ZoneLighting.ZoneProgramNS.InputStartingValues, interruptQueue: ActionBlock`1 Id=2) 2: ZoneLighting.ZoneProgramNS.ZoneProgram.Start(inputStartingValues: , interruptQueue: ActionBlock`1 Id=2) […]

如何使用FakeItEasy伪造一个动作

我正在使用FakeItEasy库为我的unit testing创​​建假货。 我有一个ClassUnderTest ,我想在其上测试方法MethodToTest(Data dataObject) 。 这个方法调用一个我想伪造的接口的方法: public interface IFoo { void Execute(Action action); } public class ClassUnderTest { private IFoo _foo; public ClassUnderTest(IFoo foo) { _foo = foo; } public void MethodToTest(Data dataObject) { _foo.Execute(dataAccess => dataAccess.Update(dataObject)); } } public interface IDataAccess { void Update(Data data); } public class Data { public int Property […]

使用FakeItEasy在方法中模拟方法

如何从另一个函数中调用的函数模拟/解析结果? 通常,Test2将是一个DataAccess方法,我不想获取真实数据。 我喜欢我测试的unit testing是业务逻辑。 这就是我现在拥有的,但它根本不起作用。 Sum总是断言为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! } 然后我有一个Unittest,我想在我的“业务逻辑”上运行。 [TestMethod()] public void […]

伪造/模拟接口给出“没有默认构造函数”错误,怎么会这样?

我正在尝试编写存储库实现的unit testing。 存储库使用RavenDB作为数据库。 对于unit testing,我想模拟RavenDB部分。 为了创造嘲笑(假货)我正在使用FakeItEasy。 我认为由于RavenDB API是通过接口访问的,因此模拟/伪装不会有任何问题。 但是,在尝试实例化特定模拟时,我确实遇到了问题。 我的unit testing代码的相关部分如下所示: [Fact] public void Test() { UserDocument doc = …; IQueryable where = A.Fake<IQueryable>(); A.CallTo(() => where.First()).Returns(doc); IRavenQueryable query = A.Fake<IRavenQueryable>(); IDocumentSession session = A.Fake(); A.CallTo(() => session.Query()).Returns(query); IDocumentStore store = A.Fake(); A.CallTo(() => store.OpenSession()).Returns(session); . . . } 在实例化IRavenQueryable假的时候,我得到了一个exception。 这是来自Xunit.net跑步者的日志: UnitTest.Test : FakeItEasy.Core.FakeCreationException : […]

如何测试Nhibernate的扩展方法,即使在fakeiteasy中指定return后也没有返回值?

我有一个像下面这样的类使用Fluent Nhibernate我从数据库中获取数据 public class MyActualClass { public MyActualClass(ISessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } public List GetData() { using (session = sessionFactory.OpenSession()) { var result = session.QueryOver() .SelectList(list => list .Select(x => x.Id) .Select(x => x.CreationDate) .Select(x => x.AnnualAmount) .Select(x => x.AnnualCurrency) .Select(() => monthlyAlias.MonthlyAmount) .Select(() => monthlyAlias.MonthlyCurrency) .Select(() => shareAlias.CurrentSharevalue) .Select(() => miscAlias.MarketValueAmount) ).Where(a […]

在同一对象上调用两次时,MustHaveHappened失败

给定以下测试类(以及相关的DTO类和接口): public class Foo { private readonly IBar _bar; public Foo(IBar bar) { _bar = bar; } public void DoStuff() { var dto = new DTO(); dto.Num = 1; _bar.Test(dto); dto.Num = 2; _bar.Test(dto); } } public class DTO { public int Num { get; set; } } public interface IBar { void Test(DTO dto); […]

FakeItEasy代理方法调用实际实现

我正在尝试将对虚假对象的调用代理到实际实现。 这样做的原因是我希望能够使用Machine.Specifications的WasToldTo和WhenToldTo,它仅适用于接口类型的伪造。 因此,我正在执行以下操作来代理对我的真实对象的所有调用。 public static TFake Proxy(TFake fake, TInstance instance) where TInstance : TFake { fake.Configure().AnyCall().Invokes(x => x.Method.Invoke(instance, x.Arguments.ToArray())); return fake; } 我会像这样使用它。 var fake = Proxy(A.Fake(), new SomeImplementation()); //in my assertions using Machine.Specifications (reason I need a fake of an interface) fake.WasToldTo(x => x.DoOperation()); 然而问题是这只适用于void方法,因为Invokes方法没有对返回值做任何事情。 (Action param代替Func) 然后我尝试使用WithReturnValue方法执行此操作。 public static TFake Proxy(TFake fake, TInstance […]

为什么我不能在变量中捕获FakeItEasy期望值?

我正在使用FakeItEasy伪造一些entity framework调用,以确保正确映射一堆奇怪的遗留数据库表。 我需要断言具有与特定DeliveryAddress匹配的Invoice的Customer正被添加到数据库中。 如果我这样做: A.CallTo(() => db.Customers.Add( A.That.Matches( c => c.Invoices.First().Address == EXPECTED_ADDRESS) ) )).MustHaveHappened(); 代码完美无缺。 我想通过在其他地方移动期望来简化语法,但是当我这样做时: var expected = A.That.Matches( c => c.Invoices.First().Address == EXPECTED_ADDRESS) ); A.CallTo(() => db.Customers.Add(expected)).MustHaveHappened(); 测试失败。 FakeItEasy代码中发生了什么,这意味着期望表达式在内联时有效,但无法在变量中捕获并在以后重用?

在不使用魔术字符串的情况下将参数传递给FakeItEasy-mock?

在过去的几年里,我一直在使用Moq来满足我的嘲笑需求,但在看了FakeItEasy之后我想尝试一下。 我经常想测试一个方法是否使用正确的参数调用,但我发现没有令人满意的方法来使用FakeItEasy。 我有以下代码来测试: public class WizardStateEngine : IWizardStateEngine { private readonly IWorkflowInvoker _workflowInvoker; private List _history; public WizardStateEngine(IWorkflowInvoker workflowInvoker) { _workflowInvoker = workflowInvoker; } public void Initialize(List history) { _history = history; } public WizardStateContext Execute(Command command, WizardStateContext stateContext, CustomBookmark step) { Activity workflow = new MyActivity(); var input = new Dictionary(); input[“Action”] = command; […]

在同一对象中的另一个方法上使用FakeItEasy的A.CallTo()

使用FakeItEasy,如何检查我的对象的方法是否在同一个对象上调用另一个方法? 考试: [TestMethod] public void EatBanana_CallsWillEat() { var banana = new Banana(); var myMonkey = new Monkey(); myMonkey.EatBanana(banana); //this throws an ArgumentException, because myMonkey is a real instance, not a fake A.CallTo(() => myMonkey.WillEat(banana) .MustHaveHappened(); } class级: public class MyMonkey { private readonly IMonkeyRepo _monkeyRepo; public MyMonkey(IMonkeyRepo monkeyRepo) { _monkeyRepo = monkeyRepo; } public void […]