我有一个方法,其out参数返回许多记录.我想知道如何用FakeItEasy来嘲笑它.
我有一个工厂接口,用于创建一些数据对象.
interface IFactory
{
IData Create (string name, string data);
}
interface IData
{
// ....
}
class Data : IData
{
public Data (string name, string data)
{
// .....
}
}
Run Code Online (Sandbox Code Playgroud)
我需要创建一个模拟工厂来传递给另一个模块,这个模块将使用这个模拟来创建数据.
简单来说,一个简单的模块如下所示:
class QuickModule
{
private readonly IFactory _factory;
public QuickModule (IFactory factory)
{
_factory = factory;
}
public IEnumerable<IData> GetData ()
{
yield return _factory.Create ("name1", "abc");
yield return _factory.Create ("name2", "def");
}
}
Run Code Online (Sandbox Code Playgroud)
因此,工厂被调用两次,有两组参数.
使用Moq,这很容易:
var factoryMock = new Mock<IFactory> ();
factoryMock.Setup (x => x.Create …
Run Code Online (Sandbox Code Playgroud) 我遇到一个问题,即在一个非常简单的测试中FakeItEasy调用失败并出现错误"指定的对象未被识别为伪对象".电话很简单:
A.CallTo(myService.MyMethod(listOfStringsFilter)).MustHaveHappened();
Run Code Online (Sandbox Code Playgroud)
假的同样简单(A.Fake()),并用一个方法伪造一个interofance,它接受一个列表并返回一个列表.在调试模式下,我看到myService的实例是{Fake IMyInterface}类型.无论如何,这个问题真的让我感动,感谢您的帮助.
更新:
这是我自己的错误,我需要打电话说:
A.CallTo(() => myService.MyMethod(listOfStringsFilter)).MustHaveHappened();
Run Code Online (Sandbox Code Playgroud) 我正在使用xUnit,SubSpec和FakeItEasy进行单元测试.到目前为止,我已经创建了一些积极的单元测试,如下所示:
"Given a Options presenter"
.Context(() =>
presenter = new OptionsPresenter(view,
A<IOptionsModel>.Ignored,
service));
"with the Initialize method called to retrieve the option values"
.Do(() =>
presenter.Initialize());
"expect the view not to be null"
.Observation(() =>
Assert.NotNull(view));
"expect the view AutoSave property to be true"
.Observation(() => Assert.True(view.AutoSave));
Run Code Online (Sandbox Code Playgroud)
但是现在我想写一些负面单元测试并检查某些方法是否被调用,并抛出异常
例如
"Given a Options presenter"
.Context(() =>
presenter = new OptionsPresenter(view,
A<IOptionsModel>.Ignored,
service));
"with the Save method called to save the option values"
.Do(() =>
presenter.Save());
"expect an ValidationException to be thrown" …
Run Code Online (Sandbox Code Playgroud) 我需要验证是否使用特定类型的对象调用了方法
这是我想测试它被调用的方法的接口:
interface IPlayer
{
void Send(object message);
}
Run Code Online (Sandbox Code Playgroud)
考试:
var player1 = A.Fake<IPlayer>();
room.AddPlayer(player1);
room.DoSomething();
A.CallTo(() => player1.Send(A<Type1>.Ignored)).MustHaveHappened();
Run Code Online (Sandbox Code Playgroud)
因为player1.Send
我得到了很多不同对象的多次调用InvalidCastException
谁知道如何正确地做到这一点?
什么是Dummy用于FakeItEasy?它与A.Fake或A.Ignored有何不同?
谢谢 :-)
使用FakeItEasy,我试图捕获假对象上的属性值的设置:
首先是界面:
interface ISomeInterface
{
int MyProperty {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
然后是单元测试的一个片段:
var myObject = A.Fake<ISomeInterface>();
int saved = 0;
A.CallTo (() => myObject.MyProperty).Invokes (x => saved = ?????);
SomeMethod (myObject);
Assert.That (saved, Is.EqualTo (100));
Run Code Online (Sandbox Code Playgroud)
而且有
void SomeMethod (ISomeInterface intf)
{
intf.MyProperty = 100;
}
Run Code Online (Sandbox Code Playgroud)
我不知道要替换什么?????
我想知道是否有人可以为所有可能的类型(或指定的子类型)伪造泛型方法调用?
例如,假设我们有这个美妙的IBar界面.
public interface IBar
{
int Foo<T>();
}
Run Code Online (Sandbox Code Playgroud)
我可以伪造一个依赖于这个IBar的Foo调用,而不必指定T是任何特定类型吗?
[TestFixture]
public class BarTests
{
[Test]
public void BarFooDoesStuff()
{
var expected = 9999999;
var fakeBar = A.Fake<IBar>();
A.CallTo(() => fakeBar.Foo<T>()).Returns(expected);
var response = fakeBar.Foo<bool>();
Assert.AreEqual(expected, response);
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢!
我有一个测试(代码如下)来测试Method1调用Method2.我得到的例外是
当前代理生成器无法拦截指定的方法,原因如下: - 无法拦截密封方法.
被测方法本身并未密封.但是,它确实依赖于密封类(第三方类,我在创建包装器时遇到了麻烦,以便正确地模拟它 - 另一个问题的另一个主题).无论哪种方式,在这一点上,我并不是要求FakeItEasy嘲笑密封的班级.在调试我的测试时,当调用依赖项时,我可以清楚地看到正在生成一个真实的对象,而不是假的.
然而,鉴于错误信息,我觉得它可能会以某种方式相关.
此外,我通过随机博客文章发现,使方法虚拟修复问题,允许测试通过.我试了一下它就有效了.但我不明白为什么它修复它,而且无论如何,保持方法虚拟对我没有意义.就我而言,被测试的班级没有自己的孩子,即; 没有孩子覆盖它的方法,所以我看不出有任何理由让它成为虚拟的.
我错误地认为我没有理由让这个方法成为虚拟的吗?
是FakeItEasy以某种方式试图嘲笑密封的班级?
我真的不确定如何进行这项测试.
我的测试
[SetUp]
public void SetUp()
{
// Arrange
_service2 = A.Fake<Service2>(x => x.WithArgumentsForConstructor(
() => new Service2()));
_service1 = A.Fake<Service1>(x => x.WithArgumentsForConstructor(
() => new Service1(_service2)));
}
[Test]
public void when_Method1_executes_it_calls_Method2()
{
// Act
result = _service1.Method1();
// Assert
A.CallTo(() => _service2.Method2())
.WithAnyArguments()
.MustHaveHappened();
}
Run Code Online (Sandbox Code Playgroud)
相关方法
public class Service1 : IService1
{
private readonly IService2 _service2;
public Service1(IService2 service2) …
Run Code Online (Sandbox Code Playgroud) fakeiteasy ×10
c# ×8
mocking ×4
tdd ×2
unit-testing ×2
.net ×1
asp.net-mvc ×1
bdd ×1
c#-4.0 ×1
generics ×1
nunit ×1
testing ×1
xunit ×1