2009-08-08 7 views
0

私はmoqを使ってテストしていますが、私は正しくモックすることができないという問題に遭遇しました。 これは私のリポジトリクラスです:MOQの問題 - mockedクラスが不正なデータを返す

public interface IAccountsRepository 
    { 
     IQueryable<Account> Accounts { get; } 
     IQueryable<Account> AccountsPaged(int pageSize, int selectedPage); 
    } 

これは実装(偽)のいずれかです。

public class FakeAccountsRepository : IAccountsRepository 
    { 
     private static readonly IQueryable<Account> FakeAccounts = new List<Account> { 
     new Account {RegistrationEmail = "[email protected]"}, 
     new Account {RegistrationEmail = "[email protected]"}, 
     new Account {RegistrationEmail = "[email protected]"}, 
     new Account {RegistrationEmail = "[email protected]"}, 
     new Account {RegistrationEmail = "[email protected]"} 
     }.AsQueryable(); 

     public IQueryable<Account> Accounts 
     { 
      get { return FakeAccounts; } 
     } 

     public IQueryable<Account> AccountsPaged(int pageSize, int selectedPage) 
     { 
      return FakeAccounts.Skip((selectedPage - 1)*pageSize).Take(pageSize).AsQueryable(); 
     } 
    } 

これは実ページと偽物やSQLのデータ(IOC)と完璧に動作コントローラの定義です実際のWebページ内:

public class AccountsController : Controller 
    { 
     private IAccountsRepository _accountsRepository; 
     public int PageSize = 3; 

     public AccountsController(IAccountsRepository accountsRepository) 
     { 
      this._accountsRepository = accountsRepository; 
     } 

     public ViewResult List(int selectedPage) 
     { 
       return View(_accountsRepository.AccountsPaged(PageSize, selectedPage).ToList()); 
     } 
    } 

これはMOQの方法であり、

それはリストのページネーションのこの実装で正常に動作します:

public ViewResult List(int selectedPage) 
     { 
      return View(_accountsRepository.Accounts.Skip((selectedPage - 1) * PageSize).Take(PageSize).ToList()); 

     } 

が、これを使用している場合、それは失敗します。

public ViewResult List(int selectedPage) 
     { 
      return View(_accountsRepository.AccountsPaged(PageSize, selectedPage).ToList()); 
     } 

テストを変更するだけList実装を変更せずに(のみ.Accountsに改ページをしています)それはすべて動作しますが、AccountsPagedメソッドを使用しようとすると、要素を返しません。 実際の使用では、Webページ上では両方向で動作します。

ご連絡ください、ありがとうございます。

EDIT: 私はこれを行う場合:今は:

mockProductsRepos.Setup(x => x.AccountsPaged(Moq.It.IsAny<int>(), Moq.It.IsAny<int>())).Returns(accs.AsQueryable()); 

を私は5つの項目は、あなたがあなたのモック

EDITでセットアップAccountsPaged方法はなかった代わりに、2

答えて

2

で返さ取得AccountsPagedをセットアップしたが、正しく設定しなかった。ここではどのように適切に設定、それをする:

mockProductsRepos 
    .Setup(x => x.AccountsPaged(Moq.It.IsAny<int>(), Moq.It.IsAny<int>())) 
    .Returns((int pageSize, int selectedPage) => accs.Skip((selectedPage-1)*pageSize).Take(pageSize).AsQueryable()); 
+0

私は上記の記事に追加したように、今セットアップしましたが、2つではなく5つのアイテムを提供します。これは、.List()呼び出しが正しく機能すると予想されます。私はそれがどのようになることができ、なぜそれが正会員を返すのか分からない。 moqの設定をステップバイステップで進める方法はありますか? – BuzzBubba

1

が、私は任意の深さで、あなたのコードを解析できませんでしたが、一般的な経験則がある - 疑いでモック正確性については、欠落している期待を洗い流すために、厳密なモックを使います:

var mock = new Mock(MockBehavior.Strict);

あなたが偽装するのを忘れたSUTによって発行された予期せぬ呼び出しを明示的に表示します。

関連する問題