MS单元测试访问私有方法和基类成员

时间:2010-03-05 02:51:37

标签: model-view-controller unit-testing controller mstest

今天我遇到了一个问题,当我通过私有方法访问时,我无法在我的控制器中调用ControllerContext,在MS Unit Test方法中。例如

//This is my controller and private GetUsers() method
public class SampleController : Controller
{
        private IEnumerable<Users> GetUsers()
        {
            try
            {
                string cacheKey = "UserKey";
                IList<User> users;

                if (this.HttpContext.Cache[cacheKey] != null)
                {
                    users= (IList<User>)this.HttpContext.Cache[cacheKey];
                }
                else
                {
                    users= UserService.GetUsers();

                    if (users!= null)
                    {
                        this.HttpContext.Cache.Insert(cacheKey, users, null, DateTime.Now.AddDays(1), Cache.NoSlidingExpiration);
                    }
                }

                return UserExtensions.GetModifiedUsers(users);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

}

//In Unit Tests

[TestMethod]
public void SampleTestMethod()
{
      SampleController_Accessor privateAcc = new SampleController_Accessor();
      privateAcc.ControllerContext //Which is not availble intelliSense ???????????
}

有没有办法在单元测试方法中多次修改Controller来访问ControllerContext?

我需要ControllerContext,所以我可以为控制器设置模拟的HttpContext

我试过

((SampleController)privateAcc).ControllerContext = this.GetControllerContext();

但编译器会抛出错误。

任何想法都非常感激。

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

该代码实际上不是单元可测试的 - 对静态数据的依赖性过多。编写集成测试并将其称为一天,或将其拆分为两个类 - 一个获取静态内容,另一个执行任何必要的转换。

您可能可以使用像TypeMock这样的“强大”模拟框架,但我不喜欢它们。