C# Rhino mocks在do方法上引发“回调参数与方法参数委托不匹配”的异常
我使用Rhino mock来更改NHibernate DAL的行为,这样当代码调用提交事务时,模拟框架会更改行为,从而回滚事务。我这样做的原因是为了集成测试,但我不想向数据库添加任何数据 下面是我对测试中的方法/类的看法:C# Rhino mocks在do方法上引发“回调参数与方法参数委托不匹配”的异常,c#,nhibernate,testing,delegates,rhino-mocks,C#,Nhibernate,Testing,Delegates,Rhino Mocks,我使用Rhino mock来更改NHibernate DAL的行为,这样当代码调用提交事务时,模拟框架会更改行为,从而回滚事务。我这样做的原因是为了集成测试,但我不想向数据库添加任何数据 下面是我对测试中的方法/类的看法: public class NHibernateDALSave<T> : IBaseDALSave<T> where T : class { protected ISession _session; protected ISessionF
public class NHibernateDALSave<T> : IBaseDALSave<T> where T : class
{
protected ISession _session;
protected ISessionFactory _sessionFactory;
public NHibernateDALSave()
{
_sessionFactory = new Configuration().Configure().BuildSessionFactory();
}
public NHibernateDALSave(ISessionFactory sessionFactory)
{
_sessionFactory = sessionFactory;
}
public void OpenSession()
{
if (_sessionFactory == null)
{
_sessionFactory = new Configuration().Configure().BuildSessionFactory();
}
_session = _sessionFactory.OpenSession();
}
public virtual int Save(T objectToSave)
{
this.OpenSession();
using (_session)
{
using (ITransaction tx = _session.BeginTransaction())
{
try
{
Int32 NewId = Convert.ToInt32(_session.Save(objectToSave));
_session.Flush();
tx.Commit();
return NewId;
}
catch (Exception)
{
tx.Rollback();
throw;
}
}
}
}
}
这是测试代码:
public void SaveEmployee_Blank_Success()
{
//setup employee object to save
EmployeeDataContext employee = new EmployeeDataContext();
employee.Person = new PersonDataContext();
employee.PayRollNo = "12345";
employee.Person.Surname = "TEST";
//stub classes
ISessionFactory SessionFactoryStub = MockRepository.GenerateMock<ISessionFactory>();
ISession SessionStub = MockRepository.GenerateMock<ISession>();
ITransaction TranStub = MockRepository.GenerateMock<ITransaction>();
//Actual classes
ISessionFactory sessionFactory = new Configuration().Configure().BuildSessionFactory();
ISession Session = sessionFactory.OpenSession();
ITransaction Tran = Session.BeginTransaction();
try
{
//Configure to prevent commits to the database
SessionStub.Stub(ss => ss.BeginTransaction()).Return(TranStub);
SessionStub.Stub(ss => ss.Save(Arg<EmployeeDataContext>.Is.Anything)).Do((Action)delegate { Session.Save(employee); });
SessionStub.Stub(ss => ss.Flush()).Do((Action)delegate { Session.Flush(); });
TranStub.Stub(ts => ts.Commit()).Do((Action)delegate { Tran.Rollback(); });
TranStub.Stub(ts => ts.Rollback()).Do((Action)delegate { Tran.Rollback(); });
SessionFactoryStub.Stub(sf => sf.OpenSession()).Return(SessionStub);
NHibernateDALSave<EmployeeDataContext> target = new NHibernateDALSave<EmployeeDataContext>(SessionFactoryStub);
target.Save(employee);
}
catch
{
Tran.Rollback();
throw;
}
}
我得到的错误是回调参数与方法参数委托不匹配,该委托发生在try,catch块开始后的第2行
有人能帮我理解这个错误消息的含义吗?我能做些什么来解决这个问题?或者有人对如何与Nhibernate进行集成测试有什么建议吗
Al我没有使用Rhinomock,但我使用了其他模拟框架。我认为问题在于Save方法只接受一个参数,但提供给回调Do方法的委托不接受参数 这条线应该是这样的:
SessionStub.Stub(ss => ss.Save(Arg<EmployeeDataContext>.Is.Anything)).Do(arg => Session.Save(employee))
我没有使用Rhinomock,但我使用了其他模拟框架。我认为问题在于Save方法只接受一个参数,但提供给回调Do方法的委托不接受参数 这条线应该是这样的:
SessionStub.Stub(ss => ss.Save(Arg<EmployeeDataContext>.Is.Anything)).Do(arg => Session.Save(employee))
Matt的回答是正确的,但也要考虑使用,而不是考虑。当你不需要实际使用的参数时,使用起来要容易得多。 < P> Matt的答案是正确的,但也要考虑使用,而不是。当您实际上不需要像在您的案例中那样使用传入的实际参数时,它更易于使用