這是我在這樣的第一次嘗試,所以希望這是簡單的。犀牛模擬實體框架使用的UnitOfWork模式不工作
我創建了一個使用實體框架訪問數據庫的WCF服務。我已經實現了一個接口,因此我的服務可以使用EF,同時仍然可以測試。
這裏是我的服務:
public class ProjectService : IProjectService
{
private IUnitOfWork db = null;
public ProjectService(IUnitOfWork unitofwork)
{
db = unitofwork;
}
public int RegisterSite(int CPUID)
{
if (db.Servers.Count(x => x.CPUID == CPUID) > 0)
{
// do something
}
return 0;
}
}
這裏是我的UnitOfWork接口:
public interface IUnitOfWork
{
IObjectSet<tblClient> Clients { get; }
IObjectSet<tblServer> Servers { get; }
IObjectSet<tblSite> Sites { get; }
IObjectSet<tblServerLog> ServerLogs { get; }
void Commit();
}
當我使用這項服務的SQLUnitOfWork
(使用EF)或用InMemoryUnitOfWork
無論是具體實現(只是在內存對象),那麼它工作正常。
經過測試罰款與我的記憶對象我試過這個測試。
[Test]
public void RegisterAnExistingServer()
{
MockRepository mocks = new MockRepository();
IUnitOfWork MockUnitOfWork = mocks.DynamicMock<IUnitOfWork>();
ProjectService service = new ProjectService(MockUnitOfWork);
Expect.Call(MockUnitOfWork.Servers.Count(x => x.CPUID == 1234)).Return(0);
mocks.ReplayAll();
int NewSiteID = service.RegisterSite(1234);
mocks.VerifyAll();
}
但是當我嘗試使用它在犀牛模擬與預期的Servers.Count我得到以下錯誤:
System.ArgumentNullException : Value cannot be null.
Parameter name: arguments
at System.Linq.Expressions.Expression.RequiresCanRead(Expression expression, String paramName)
at System.Linq.Expressions.Expression.ValidateOneArgument(MethodBase method, ExpressionType nodeKind, Expression arg, ParameterInfo pi)
at System.Linq.Expressions.Expression.ValidateArgumentTypes(MethodBase method, ExpressionType nodeKind, ref ReadOnlyCollection`1 arguments)
at System.Linq.Expressions.Expression.Call(Expression instance, MethodInfo method, IEnumerable`1 arguments)
at System.Linq.Queryable.Count(IQueryable`1 source, Expression`1 predicate)
我在做什麼錯?
也許錯誤是指'Servers'爲空。我想你也必須設定這一點。 – 2011-03-17 06:32:34
所以我加了這一行 'MockUnitOfWork.Servers = mocks.StrictMock>();'仍然是同樣的錯誤。這是你的意思嗎? –
2011-03-17 06:40:32
一個建議是,我不會使用Record and Playback語法,因爲它已被首選的Arrange-Act-Assert樣式所取代。使用RhinoMocks,由於API處於相同的命名空間中(我上次檢查過),很難區分它們。 – aqwert 2011-03-17 07:57:49