1

我正在尝试设置一个简单的测试来演示如何模拟私有方法,但是当我运行它时,我得到以下异常:

mscorlib.dll 中出现“System.ArgumentException”类型的异常,但未在用户代码中处理

附加信息:数组不能为空。

我想GetUsers()在以下课程中进行模拟:

public sealed class UserRepository 
{
    private IList<Models.User> GetUsers()
    {
        throw new NotImplementedException();
    }
}

这是我的单元测试:

[TestMethod]
public void TestMethod()
{
    //Arrange
    UserRepository userRepo = Mock.Create<UserRepository>(Behavior.CallOriginal);
    IList<User> expected = new User[5];

    Mock.NonPublic.Arrange<IList<User>>(userRepo, "GetUsers").Returns(expected);

    //Act
    var inst = PrivateAccessor.ForType(typeof(UserRepository));
    var users = (IList<User>)inst.CallMethod("GetUsers");  //Error occurs here

    //Assert
    Assert.AreEqual(5, users.Count);
}

任何想法为什么我会收到此错误?

4

1 回答 1

3

GetUsers()在您的代码中是一个实例方法,而PrivateAccessor.ForType()仅用于访问静态成员。创建PrivateAccessor这里的最佳方法是

var inst = Mock.NonPublic.MakePrivateAccessor(userRepo);

我完全同意错误信息是荒谬的。

于 2014-06-17T05:58:13.783 回答