Pertanyaan Bagaimana cara mengejek IQueryable


Saya membuat repositori yang mengekspos IQueryable. Apa cara terbaik untuk mencemooh ini untuk pengujian unit saya?

Karena saya menggunakan RhinoMocks untuk sisa objek tiruan saya, saya mencoba melakukan hal berikut:

IQueryable<MyObject> QueryObject = 
    MockRepository.GenerateStub<IQueryable<MyObject>>();

Ini tidak berhasil, jadi saya mencoba melakukan ini:

IQueryable<MyObject> QueryObject = 
    (new List<MyObject> { new MyObject() }).AsQueryable();

Apakah ada cara yang lebih baik untuk melakukan ini, atau memiliki kerangka kerja mengejek lainnya yang dibangun untuk mendukung IQuerable?

Antarmuka repositori saya terlihat seperti ini:

public interface IRepository<T> where T : TableServiceEntity
{
    IQueryable<T> Table { get; }
    void Attach(T existingItem);
    void Delete(T itemToDelete);
    void Insert(T newItem);
    T Load(string partitionKey, string rowKey);
    IEnumerable<T> Load(string partitionKey);
    IEnumerable<T> Query(IQueryable<T> query);
    IEnumerable<T> Last(int count);
    T Last();
    void Update(T item);
}

Berikut adalah metode yang ingin saya uji:

public Post LoadPost(int year, int month, int day, string slug)
{
    var query = from p in _blogRepository.Table
                where 
                    p.PartitionKey == Key.Partition(year, month, day) 
                    && p.Slug == slug
                select p;

    var posts = _blogRepository.Query(query.Take(1));

    return posts.First();
}

Maka di sini adalah tes seperti yang saya miliki sekarang yang akan menguji LoadPost.

[Fact]
public void LoadWillRetrieveByPartitionKeyAndRowKeyWhenUsingUriFormat()
{
    Repository
        .Stub(x => x.Query(Arg<IQueryable<Post>>.Is.Anything))
        .Return(new List<Post> {_post});

    var result = Service.LoadPost(
                            _post.Year(),
                            _post.Month(), 
                            _post.Day(), 
                            _post.Slug);

    Assert.NotNull(result);
}

Kode diambil dari saya AzureBlog proyek.


32
2018-02-11 05:44


asal


Jawaban:


Saya biasanya melakukan persis apa yang Anda lakukan dalam ujian Anda. Saat menulis tes saya, saya berasumsi bahwa kelas .Net perpustakaan bekerja dengan benar dan tidak mengandung bug, sehingga saya dapat menggunakannya dalam tes. Ketika saya membutuhkan daftar tes, koleksi, queryable, kamus, dll. Saya hanya membuat hal yang nyata dan mengisi dengan data uji. Itu membuat tes jauh lebih mudah dibaca dan lebih cepat ditulis, dan jujur ​​saja risikonya tidak ada.


9
2018-02-12 10:09



Jika Anda ingin mengejek repositori Anda, Anda tidak akan mengejek IQueryable. Sebaliknya, tirulah metode repositori Anda untuk mengembalikan nilai-nilai tetap yang dikenal (seperti contoh kedua Anda) yang dapat digunakan untuk menjalankan tes unit Anda.


3
2018-02-11 16:55



Saya tahu ini adalah pertanyaan lama, tetapi hanya ingin menambahkan 2 sen saya.

Saya memiliki masalah yang sama dengan repositori yang dihasilkan dengan SharpLite, yang merupakan kerangka ASP .NET MVC yang saya gunakan dari waktu ke waktu. Setelah beberapa waktu, saya menemukan solusi, satu-satunya masalah adalah menggunakan Moq, dan bukan Rhino Mocks, tetapi mungkin Anda dapat menemukan cara untuk mengadaptasinya. Saya membuat posting blog di sini tentang cara melakukannya.

Ini pada dasarnya membuat daftar yang mengimplementasikan IQueryable dan menggunakannya sebagai latar belakang data palsu. Semoga saya bisa membantu!


2
2017-07-30 01:58



Saya tidak yakin apakah ini akan membantu Anda ... tetapi saya melakukan sesuatu seperti apa yang Anda bicarakan. Dalam skenario saya, saya memiliki kelas konteks data yang menggunakan repositori.

Saya memulai dengan membuat antarmuka (IRepository) yang menyertakan metode IQueryable. Lalu saya membuat dua kelas yang mengimplementasikan antarmuka ini. Satu kelas menggunakan ORM untuk manipulasi data (DbEntityRepository) dan kelas lain menggunakan properti kelas (MemoryRepository). Kelas konteks data memiliki konstruktor yang membutuhkan IRepository. Melakukan ini saya bisa menggunakan MemoryRepository untuk saat menguji konteks data dan saya bisa menggunakan DbEntityRepository untuk Aplikasi.

Jika Anda tertarik ... Anda dapat menemukan kode pada codeplex: IQToolkitContrib


0
2018-02-12 00:54