2009-02-11 53 views
2

我有一個名爲IAuthorizationRepository具有以下接口的接口:ParameterMismatch異常時使用Moq的回調方法

public interface IAuthorizationRepository 
{ 
    IQueryable<User> Users { get; } 

    Int32 SaveChanges(); 

    void Detach(Object entity); 
    void Attach(IEntityWithKey entity); 

    void DeleteObject(Object entity); 
    void AddObject(String entitySetName, Object entity); 
} 

當用戶被定義爲如下:

public class User{ 
string Username { get; set; }} 

我有一個這樣的TestInitialize方法:

[TestInitialize] 
    public void Init() 
    { 
     _repository = new Mock<IAuthorizationRepository>(); 

     List<User> users = new List<User>(); 

     User user = new User(); 
     user.Username = "test_osness"; 

     _repository.ExpectGet(r => r.Users).Returns(users.AsQueryable()); 

     _repository.Expect(r => r.AddObject("Users", It.IsAny<Object>())) 
      .Callback<User>(u => users.Add(u)); 

     _repository.Object.AddObject("Users", user); 

     Console.WriteLine("Users: {0}", _repository.Object.Users.Count()); 
    } 

但是當我運行測試時,我得到一個System.Reflec調用_repository.Object.AddObject(「用戶」,用戶)的行上調用.getParameterCountException。我是Moq新手,但從我能告訴的這應該工作。我究竟做錯了什麼。我想在AddObject(「用戶」,對象)被調用時將用戶對象添加到我的列表中。所以_repository.Object.Users.Count()應該反映正確的用戶數量。

回答

2

我要覆蓋我以前的答案。

這條線:

_repository.Expect(r => r.AddObject("Users", It.IsAny<Object>())) 
    .Callback<User>(u => users.Add(u)); 

正在尋求調用版本.Callback的(),它的參數。但是,您期望的「AddObject」方法需要兩個參數。我認爲你需要更多的東西是這樣的:

_repository.Expect(r => r.AddObject("Users", It.IsAny<Object>())) 
    .Callback((s, o) => users.Add(o as User)); 

現在回調拉姆達採用相同數量的參數作爲您的期望,所以它應該工作。