相关疑难解决方法(0)

使用Moq模拟NHibernate ISession

我正在使用NHibernate,ASP.NET MVC 2.0和StructureMap开始一个新项目,并使用NUnit和Moq进行测试.对于我的每个控制器,我都有一个公共构造函数,其中注入了一个ISession.应用程序本身工作正常,但就单元测试而言,我基本上必须模拟一个ISession才能测试控制器.

当我尝试使用MOQ模拟ISession时,我收到以下错误消息:

中间调用仅支持属性访问

看来我的问题是期待来自框架CreateQuery方法的用户列表,但在谷歌搜索问题之后我现在更清楚了.

我有两个问题:

1)这是模拟依赖注入ISession的错误方法吗?

2)有没有办法修改代码,以便它可以成功返回我的列表

            [Test]
            public void DummyTest()
            {

                var mock = new Mock<ISession>();
                var loc = new Mock<User>();
                loc.SetupGet(x => x.ID).Returns(2);
                loc.SetupGet(x => x.FirstName).Returns("John");
                loc.SetupGet(x => x.LastName).Returns("Peterson");

                var lst = new List<User> {loc.Object};
                mock.Setup(framework => framework.CreateQuery("from User").List<User>()).Returns(lst);

                var controller = new UsersController(mock.Object);
                var result = controller.Index() as ViewResult;
               Assert.IsNotNull(result.ViewData);
            }
Run Code Online (Sandbox Code Playgroud)

请注意,我很确定我可以创建一个硬编码的用户列表(而不是模拟单个用户并将其添加到列表中),但我想我现在已经保留了代码.

此外,此特定控制器的Index操作基本上执行上面模仿的CreateQuery调用以返回数据库中的所有用户.这是一个人为的例子 - 不要读任何细节.

在此先感谢您的帮助

编辑:在回复以下评论时,我正在添加错误的堆栈跟踪.此外,User类上的所有属性都是虚拟的.

TestCase'Beta.Tests.Unit.Controllers.UserControllerTest.Details_InValidIndex_ReturnsNotFoundView'失败:System.NotSupportedException:在设置的中间调用中仅支持属性访问.不支持的表达式framework.CreateQuery("来自用户").位于Moq.Mock.AutoMockPropertiesVisitor的Moq.ExpressionVisitor.Visit(表达式exp)Moq.Mock.AutoMockPropertiesVisitor.VisitMethodCall(MethodCallExpression m)的Moq.Exkression.Vatitor上的Moq.Mock.AutoMockPropertiesVisitor.VisitMethodCall(MethodCallExpression m)中的Moq.Mock.AutoMockPropertiesVisitor.VisitMethodCall(MethodCallExpression m) Moq.Mock上的Moq.Mock.GetInterceptor(LambdaExpression lambda,Mock mock)的.SetupMocks(表达式表达式).<> c__DisplayClass12 2.<Setup>b__11() at Moq.PexProtector.Invoke[T](Func1函数)在Moq.Mock.Setup [T1,TResult](模拟模拟,表达式1 expression) at Moq.Mock1.Setup …

.net c# nhibernate unit-testing moq

25
推荐指数
2
解决办法
1万
查看次数

具有接口类型约束的C#泛型方法

我们假设我有:

  • 一般方法 Get<T>
  • 一些接口IEntity,IValue
  • 一些分别实现这些接口的类:Entity- > IEntity,Value- > IValue等.

=>该Get<T>方法是否有办法仅允许接口作为泛型类型?

Get<IEntity>(42); //Allowed
Get<Entity>(42);  //Compiler error
Run Code Online (Sandbox Code Playgroud)

我目前的解决方案如下:

  • Get<T>具有Type约束的通用方法where T: IPersistable(以防止大多数类型作为参数传递)
  • 接口实现 IPersistable

该函数主动检查类型:

public T Get<T>(long id) where T : IPersistable
{
   if (typeof (T) == typeof (IEntity))
      return (T) EntityDao.Get(id);
   if (typeof (T) == typeof (IValue))
      return (T) ValueDao.Get(id);

   //...

   throw new TechnicalException("Type not supported");
}
Run Code Online (Sandbox Code Playgroud)

=>问题是:

  1. 它不干净......我可以忍受它,因为只有很少的类型可以检查
  2. 签名与函数的确无关.它允许IPersistablein,但不是真的< - 真的让我烦恼:(

编辑:我正在考虑这样的限制,以避免我班上的人口过剩.

我在那个类中有类似8或9个泛型方法的东西,它们都以这种方式工作.直观的做法是@DanielHilgarth建议每种类型只有1种方法.目前可以使用4种或5种类型调用这些方法.但是,这仍然意味着该课程中有32-40种方法. …

c# generics interface

3
推荐指数
1
解决办法
3835
查看次数

标签 统计

c# ×2

.net ×1

generics ×1

interface ×1

moq ×1

nhibernate ×1

unit-testing ×1