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

时间:2014-09-05 09:33:41

标签: c#-4.0 fakeiteasy

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

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

方法GetUserProfile在实际实现中返回一些对象。但由于某种原因,我希望此方法返回null。我使用上面的代码来实现这个目的,但它返回的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");
    }

生产方法如下所示

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;
        }
    }

任何帮助将不胜感激

由于

3 个答案:

答案 0 :(得分:1)

为了配置方法,它has to be virtual, abstract, or defined on an interface that you're faking。但是,

public UserDAO GetUserProfile(string userName)

既不是虚拟的也不是抽象的,所以除非你从界面创建虚假,否则这不起作用。但是,A.CallTo在尝试在具体(非伪造)对象上配置非虚方法或方法时会引发错误,并且您没有提及这些事情中的任何一种。

从您的代码中,我们仍然无法告诉

  1. client来自哪里(我知道,容器,但它是如何到达的?),
  2. controller是否使用相同的client
  3. controller.CheckUsernameclient.GetUserProfile之间的关联是
  4. 我此时的猜测是

    1. controller使用CheckUsername的任何内容,与测试的client不同,或
    2. 使用错误的client.GetUserProfile调用
    3. userName(尽管您在controller.CheckUsername(userName)中使用了相同的内容,但这似乎不太可能)
    4. 如果您无法或不愿意连接点,我建议在所有点检查userName的值,并确保在生产代码中调用client时,它& #39;一个伪造的对象(调试并检查类型 - 应该清楚它是你的类型还是假的)。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

或者您可以将null转换为上下文中的类型。

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