Pertanyaan Urutan berulang beberapa kali


Saya ingin mengganti objek untuk mengembalikan urutan objek yang berbeda. Sebagai contoh:

var http = Substitute.For<IHttp>();
http.GetResponse(Arg.Any<string>()).Returns(resourceString, resourceString2);
http.GetResponse(Arg.Any<string>()).Returns(x => { throw new Exception(); });

akan mengembalikan resourceString kemudian resourceString2, kemudian terkecuali.

Atau sesuatu seperti ini:

var http = Substitute.For<IHttp>();
http.GetResponse(Arg.Any<string>()).Returns(resourceString, x => { throw new Exception(); }, resourceString2);

akan mengembalikan resourceString lalu eksepsi kemudian resourceString2.

Bagaimana saya bisa melakukannya?


4
2017-08-28 16:43


asal


Jawaban:


Sintaks beberapa pengembalian dalam NSubstitute hanya mendukung nilai. Untuk juga membuang pengecualian, Anda harus meneruskan fungsi Returns, dan terapkan logika yang diperlukan sendiri (mis. Returns(x => NextValue())).

Ada contoh terkait untuk Urutan Moq di blog Haacked menggunakan antrian. Anda dapat melakukan hal yang sama dengan NSubstitute (misalnya kode saja, gunakan risiko Anda sendiri :)):

public interface IFoo { int Bar(); }

[Test]
public void Example() {
    var results = new Results<int>(1)
                    .Then(2)
                    .Then(3)
                    .Then(() => { throw new Exception("oops"); });
    var sub = Substitute.For<IFoo>();
    sub.Bar().Returns(x => results.Next());

    Assert.AreEqual(1, sub.Bar());
    Assert.AreEqual(2, sub.Bar());
    Assert.AreEqual(3, sub.Bar());
    Assert.Throws<Exception>(() => sub.Bar());
}

public class Results<T> {
    private readonly Queue<Func<T>> values = new Queue<Func<T>>();
    public Results(T result) { values.Enqueue(() => result); }
    public Results<T> Then(T value) { return Then(() => value); }
    public Results<T> Then(Func<T> value) {
        values.Enqueue(value);
        return this;
    }
    public T Next() { return values.Dequeue()(); }
}

Semoga ini membantu.


10
2017-08-29 00:06



Ini sekarang fitur yang didukung di NSubstitute dengan antarmuka yang sangat ramah.

Itu akan menjadi sesuatu seperti ...

var http = Substitute.For<IHttp>();
http.GetResponse(Arg.Any<string>()).Returns(x => resourceString, x => resourceString2, x => { throw new Exception(); });

Dokumentasi dapat ditemukan di sini


7
2017-07-17 17:54



Berikut ini contoh yang melakukan semua hal tanpa kelas tambahan. Jika Anda melakukan ini banyak saya mungkin akan pergi dengan opsi kelas terpisah.

[Test]
public void WhenSomethingHappens()
{
    var something = Substitute.For<ISomething>();
    int callCount = 0;
    something.SomeCall().Returns(1, 2);
    something.When(x => x.SomeCall()).Do(obj => { if (++callCount == 3) throw new Exception("Problem!"); });

    Assert.AreEqual(1, something.SomeCall());
    Assert.AreEqual(2, something.SomeCall());
    Assert.Throws<Exception>(() => something.SomeCall());
}


public interface ISomething
{
    int SomeCall();
}

3
2017-08-29 01:19



Contoh lain dengan parameter keluar. Selain itu itu berguna untuk beberapa skenario ketika fungsi disebut secara berkala di thread terpisah. Kita dapat mensimulasikan / mengejek setiap panggilan secara berbeda.

   List<AnyClass> items = new List<AnyClass>();

   mockIService.TryDoSth(out response).ReturnsForAnyArgs(p =>
            {
                p[0] = items;
                return true;
            }, 
            p =>
            {
                p[0] = items;
                return true;
            }, p =>
            {
                throw new Exception("Problem!"); 
            });

bool TryDoSth (hasil Daftar Keluar);


0
2017-09-17 14:13