FakeItEasy возвращает неправильный возврат - PullRequest
0 голосов
/ 22 декабря 2018

В приведенном ниже коде у меня есть метод howmanystringasync, который вызывает два других метода.Эти двое подделаны.Возвращение второго фейка не работает из-за ".ToList ()".

Я обычно возвращаю IEnumerable, потому что в некоторых случаях я хочу ограничить действия вызывающей стороны.И иногда я спрашиваю при вводе непосредственно List, чтобы метод мог сделать то, что может предложить List.

Как сделать так, чтобы тест, приведенный ниже, работал?

var result = awaitf.AccessTheWebAsync2 (web.ToList ());

using FakeItEasy;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using Xunit;

namespace api.tests.unit
{
    public class SpecialString
    {
        public int IntProperty { get; set; }
        public string StringProperty { get; set; }

        public override bool Equals(object obj)
        {

            if (obj == null || GetType() != obj.GetType())
            {
                return false;
            }

            if (ReferenceEquals(this, obj)) return true;

            return Equals(obj as SpecialString);
        }

        public bool Equals(SpecialString other)
        {
            if (other == null) return false;

            return (this.IntProperty == other.IntProperty) && (this.StringProperty == other.StringProperty);
        }
    }

    public interface IFoo
    {
        Task<IEnumerable<SpecialString>> AccessTheWebAsync(int a, int b);
        Task<int> AccessTheWebAsync2(List<SpecialString> integers);
    }

    public class Foo : IFoo
    {
        public async Task<IEnumerable<SpecialString>> AccessTheWebAsync(int a, int b)
        {
            HttpClient client = new HttpClient();
            string result = await client.GetStringAsync("https://msdn.microsoft.com");

            var results = new List<SpecialString> {
                        new SpecialString{
                            IntProperty = 1,
                            StringProperty = "stringprop1"
                        },
                    new SpecialString{
                        IntProperty =2,
                        StringProperty = "stringprop2"
                    }
                };

            return results;
        }

        public async Task<int> AccessTheWebAsync2(List<SpecialString> specialstrings)
        {
            HttpClient client = new HttpClient();
            string result = await client.GetStringAsync("https://msdn.microsoft.com");

            var results = new List<SpecialString> {
                        new SpecialString{
                            IntProperty = 1,
                            StringProperty = "stringprop1"
                        },
                    new SpecialString{
                        IntProperty =2,
                        StringProperty = "stringprop2"
                    }
                };

            return results.Count();
        }

    }

    public class BiggerFoo
    {
        private readonly IFoo f;

        public BiggerFoo(IFoo f)
        {
            this.f = f;
        }

        public async Task<int> howManyStringsAsync(int a, int b)
        {

            var web = await f.AccessTheWebAsync(a, b);

            var result = await f.AccessTheWebAsync2(web.ToList());
            return result;
        }
    }

    public class FooTest
    {
        [Fact]
        public void testasyncmethod()
        {
            var fakeFoo = A.Fake<IFoo>();
            IEnumerable<SpecialString> result = new List<SpecialString> {
                        new SpecialString{
                            IntProperty = 1,
                            StringProperty = "fakestringprop1"
                        },
                    new SpecialString{
                        IntProperty =2,
                        StringProperty = "fakestringprop2"
                    }
                };

            A.CallTo(() => fakeFoo.AccessTheWebAsync(1, 2)).Returns<Task<IEnumerable<SpecialString>>>(Task.FromResult(result));

            A.CallTo(() => fakeFoo.AccessTheWebAsync2(result.ToList())).Returns<Task<int>>(Task.FromResult(5));

            var bFoo = new BiggerFoo(fakeFoo);
            bFoo.howManyStringsAsync(1, 2);
        }
    }

}

1 Ответ

0 голосов
/ 22 декабря 2018

Если я все правильно прочитал, проблема в том, что вы конфигурируете AccessTheWebAsync2, чтобы возвращать 5 при заданном конкретном List<SpecialString>, но в вашем тесте метод вызывается с другим List<SpecialString> и только List<SpecialString>.Equalsссылается на равенство, поэтому вы получаете 0 обратно.Если вы хотите убедиться, что 5 возвращается, когда List<SpecialString>, содержащий желаемые SpecialString s, переданы в AccessTheWebAsync2, вам необходимо настроить ограничение.Похоже, что SpecialString также не имеет Equals на основе значений, так что вы можете рассмотреть изучение свойств элементов:

A.CallTo(() => fakeFoo.AccessTheWebAsync(1, 2)).Returns(result);
A.CallTo(() => fakeFoo.AccessTheWebAsync2(
        A<List<SpecialString>>.That.Matches(l =>
            l.Count == 2 && l[0].IntProperty == 1 && l[1].StringProperty == "fakestringprop2")))
 .Returns(5);

Или, если вы действительно не заботитесь о вводезначение, что-то вроде

A.CallTo(() => fakeFoo.AccessTheWebAsync2(A<List<SpecialString>>._))
 .Returns(5);

Обновление : теперь, когда вы добавили SpecialString.Equals, использование значений списка в качестве ограничения соответствия вызовов стало проще:

A.CallTo(() => fakeFoo.AccessTheWebAsync2(
     A<List<SpecialString>>.That.IsSameSequenceAs(result)))
  .Returns(5);

Если вы этого еще не сделали, проверьте все ограничения аргументов, которые предоставляет FakeItEasy .

...