- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在单元测试中使用 FakeItEasy 作为模拟框架。方法 fakeUserService.AddUser 被模拟为返回新的 MwbeUser 对象,方法 AddUser 中有一些非空值
A.CallTo(() => fakeUserService.AddUser(new MwbeUserRegistrationIn()
{
UserName = userName,
FirstName = firstName,
SecondName = secondName,
Password = passwd,
Email = email,
BirthDate = birthdate
})).Returns(new MwbeUser
{
UserName = userName,
Email = email,
FirstName = firstName,
SecondName = secondName,
BirthDate = birthdate
});
但它返回空值。为什么?
public void AddUserWithProperdata_UserIsAddedAndEmailIsGenerated()
{
// Arrange
String userName = "user";
String firstName = "Ala";
String secondName = "ADsadas";
String passwd = "passwd";
String email = "kot@wp.pl";
DateTime birthdate = DateTime.Today;
fakeUserService = A.Fake<IMwbeUserService>();
fakeAuthenticationService = A.Fake<IAuthenticationService>();
A.CallTo(() => fakeUserService
.AddUser(new MwbeUserRegistrationIn() { UserName = userName, FirstName = firstName, SecondName = secondName, Password = passwd, Email = email, BirthDate = birthdate }))
.Returns(new MwbeUser { UserName = userName, Email = email, FirstName = firstName, SecondName = secondName, BirthDate = birthdate });
MwbeUsersController controller = new MwbeUsersController(fakeUserService, fakeAuthenticationService);
MwbeUserRegistrationJson userjson = new MwbeUserRegistrationJson
{
username = userName,
passwd = passwd,
firstname = firstName,
secondname = secondName,
email = email,
birthdate = birthdate
};
// Act
IHttpActionResult untypedResult = controller.AddUser(userjson);
var test1 = untypedResult as OkResult;
var test2 = untypedResult as CreatedNegotiatedContentResult<MwbeUser>;
// Assert
Assert.IsNotNull(untypedResult);
}
public interface IMwbeUserService
{
MwbeUser AddUser(MwbeUserRegistrationIn regData);
...
}
更新 1:添加 Controller 代码
[RoutePrefix("users")]
public class MwbeUsersController : ApiController
{
IMwbeUserService userSrv;
IAuthenticationService authService;
public MwbeUsersController(IMwbeUserService service, IAuthenticationService authSrv)
{
this.userSrv = service;
this.authService = authSrv;
}
...
[Route("register")]
[HttpPost]
public IHttpActionResult AddUser(MwbeUserRegistrationJson userdatadto)
{
// Validation
if (null == userdatadto)
{
return BadRequest("No user data");
}
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
var registrationData = Conversion.ToUser(userdatadto);
if(registrationData.Code != MwbeResponseCodes.OK)
{
return BadRequest(registrationData.ErrorMessage);
}
// Registration
try
{
MwbeUser createdUser = userSrv.AddUser(registrationData.Data);
return Created<MwbeUser>("/users/" + createdUser.Id, createdUser);
}
catch (UserAlreadyExistsException)
{
return BadRequest("User with this username already exists");
}
catch (InvalidEmailAddress)
{
return BadRequest("Given e-mail address is invalid");
}
}
最佳答案
我对 FakeItEasy 没有什么经验,但我猜你的期望太严格了。
AddUser 的期望只有在使用被认为相等的对象调用时才会匹配(就像使用 object.Equals(object, object) 一样。
由于您的 Controller 传入了不同的 MwbeUserRegistrationIn 对象 (registrationData):
.AddUser(new MwbeUserRegistrationIn() {
UserName = userName,
FirstName = firstName,
SecondName = secondName,
Password = passwd,
Email = email,
BirthDate = birthdate }))
并且MwbeUserRegistrationIn大概不会覆盖object.Equals(object)
,这个期望不会被触发。您可以使用基于值的语义实现 MwbeUserRegistrationIn.Equals(object)
或通过称为 argument constraints 的东西放宽您的期望.
在您的情况下,您可以稍微重写一下期望:
A.CallTo(() => fakeUserService.AddUser(A<MwbeUserRegistrationIn>.That.Matches(u =>
u.UserName == userName &&
u.FirstName == firstName &&
u.SecondName == secondName &&
u.Password == passwd &&
u.Email == email &&
u.BirthDate == birthdate)))
.Returns(new MwbeUser
{
UserName = userName,
Email = email,
FirstName = firstName,
SecondName = secondName,
BirthDate = birthdate
});
关于c# - FakeItEasy:模拟方法未返回预期结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32067284/
当我尝试伪造委托(delegate)类型时,我得到 System.InvalidCastException [TestMethod] public void TestDelegateFake() {
我有一个包含如下成员的界面: void ExecuteSqlCommand(string procedureName, SqlParameter[] parameters); 我正在使用 FakeIt
我可以在 FakeIteasy CallTo 断言中使用表达式树作为参数约束吗? 在具有以下签名的接口(interface)上给定一个方法: interface IRepository { T
我需要验证是否使用特定类型的对象调用了方法 这是我要测试它被调用的方法的接口(interface): interface IPlayer { void Send(object message);
我最近尝试使用 FakeItEasy,但如果不解决许多怪癖,我无法从具体类创建 Fake。 我尝试了以下方法: public class MyObject { public MyObject(){}
可以 FakeItEasy使用 .NET 核心?我已经通过 NuGet 安装了它,但我无法在项目中将它引用为 using FakeItEasy因为它没有找到。我在 NuGet 依赖项下进行了检查,我将
我正在尝试为依赖依赖项的方法编写单元测试,该依赖项提供接受对象并修改它的方法,但不会在“新路径”上返回它,例如作为返回值或通过引用参数。 public class Product { publ
我刚开始使用 FakeItEasy,第一次尝试就卡住了。我想伪造的接口(interface)有这样的方法: byte[] ReadFileChunk(string path,int offset,in
我正在尝试伪造对带有 out 参数的方法的调用,其中包含带有一些基本逻辑的 ReturnsLazily。理想情况下,我可以根据 ReturnsLazily 通过 AssignsOutAndRefPar
我有一个具有以下签名的方法。 Foo GetFooById( int id, params string[] children ) 此方法在名为 IDal 的接口(interface)上定义。 在我的
我有一些代码,其中我有一个假的配置根。我想检查是否进行了设置配置值的调用。 var fakeConfigRoot = A.Fake(); //Do something that will set co
我在 Math 类中有一个名为 GetNumber() 的函数。我想在第一次调用时返回 1,在第二次调用时返回 2,依此类推。我在 Mockito 中做过这样的事情 when(mathObj.GetN
有什么方法可以检索插入到伪造类中的伪造对象吗? 例如 假设我有以下接口(interface) + 类; public interface IFakeable { void FakeYou();
我想像这样设置我的假货: A.CallTo(() => this.repository.Create(A._)).Returns(XYZ); 哪里XYZ与在 A._ 处插入的变量相同 所以如果Crea
我试图从 child 那里伪造对 parent 公共(public)虚拟验证方法的调用但没有成功(使用 FakeItEasy。我有一个基类可以验证类似命令类的简单命令(我减少了为简单起见的代码):
我有一个用 FakeItEasy v2.2.0 编写的单元测试。 测试测试一个方法,让调用它MethodA调用MethodB。 简单类: public class Foo { public v
我使用 fake 很容易为我的对象生成假货。现在我测试是否调用了假对象上的一些方法。问题是我希望每个单元测试都将假的状态重置回原始状态。 我需要这个,因为我为每个单元测试类生成了一次伪造,所以我需要以
看来以下代码的行为与我预期的不同: using FakeItEasy; using Microsoft.VisualStudio.TestTools.UnitTesting; [TestClass]
我在单元测试中使用 FakeItEasy 作为模拟框架。方法 fakeUserService.AddUser 被模拟为返回新的 MwbeUser 对象,方法 AddUser 中有一些非空值 A.Ca
我有一个类型依赖于通过通用方法执行查询的外部组件。这是正在播放的内容的简化版本: public class UnitUnderTest { private IQueryEngine _engi
我是一名优秀的程序员,十分优秀!