如何使用 FakeItEasy 从方法返回 Null 值

Ran*_*jit 6 fakeiteasy c#-4.0

我有一个使用 FakeitEasy 伪造的服务,我正在尝试调用它的方法。这是代码

        var client = container.Resolve<MyService>();
        A.CallTo(() => client.GetUserProfile(userName)).Returns(null);
Run Code Online (Sandbox Code Playgroud)

GetUserProfile 方法在实际实现中返回一些对象。但出于某种原因,我希望此方法返回空值。我正在使用上面的代码来实现这个目的,但它返回的是 Fake 对象而不是 null。

这是我正在使用的测试设置

    [Test]
    public void MyTest(string sitecollectionGuid, string customerName)
    {
        var mockHttpContext = SetupHttpContext(sitecollectionGuid, customerName);

        var client = container.Resolve<MyService>();
        A.CallTo(() => client.GetUserProfile(userName)).Returns(null);

        var controllerContext = new ControllerContext(mockHttpContext, new RouteData(), A.Fake<ControllerBase>());
        controller.ControllerContext = controllerContext;

        var result = controller.CheckUsername(userName);
        Assert.IsNotNull(result, "Result is not as expected");
    }
Run Code Online (Sandbox Code Playgroud)

制作方法如下

public UserDAO GetUserProfile(string userName)
    {
        UserDAO objUserProfile = new UserDAO();
        IUsers objUsers = (IUsers)Global.Container["Users"];
        IUser objUser = objUsers.GetByUserName(userName);
        if (objUser == null)
        {

            return null;
        }
        else
        {
            objUserProfile = AutoMapper.Mapper.Map<IUser, UserDAO>(objUser);
            objUserProfile.FirstName = objUser.FirstName;
            objUserProfile.MiddleName = objUser.MiddleName;
            objUserProfile.LastName = objUser.LastName;
            ....................
            ....................
            <setting other properties>
            .................... 
            ....................

            return objUserProfile;
        }
    }
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激

谢谢

And*_*ren 6

尝试输入您的(空)引用。

UserDAO returnValue = null;    
var client = container.Resolve<MyService>();
        A.CallTo(() => client.GetUserProfile(userName)).Returns(returnValue);
Run Code Online (Sandbox Code Playgroud)


Bla*_*rad 1

为了配置一个方法,它必须是虚拟的、抽象的或在您伪造的接口上定义的。然而,

\n\n
public UserDAO GetUserProfile(string userName)\n
Run Code Online (Sandbox Code Playgroud)\n\n

既不是虚拟的也不是抽象的,所以除非你从接口创建一个假的,否则这是行不通的。但是,A.CallTo当尝试配置非虚拟方法或具体(非伪造)对象上的方法时,会引发错误,并且您没有提到发生这些事情。

\n\n

从你的代码中,我们仍然无法判断

\n\n
    \n
  1. 来自哪里client(我知道,容器,但它是怎么到达那里的?),
  2. \n
  3. 是否controller使用相同client,以及
  4. \n
  5. controller.CheckUsername和之间client.GetUserProfile有什么联系
  6. \n
\n\n

我目前的猜测是

\n\n
    \n
  1. 无论controller使用什么,它都与测试所用的CheckUsername不一样,或者client
  2. \n
  3. client.GetUserProfile被错误地调用userName(尽管您在 中使用了相同的controller.CheckUsername(userName),所以这似乎不太可能)
  4. \n
\n\n

如果您无法或不愿意连接这些点,我建议检查userName所有点的值,并确保client在生产代码中调用时,它是一个伪造的对象(调试并检查类型\xe2 \x80\x94应该清楚是你的类型还是假的类型)。

\n