Непонятка с моками
От: Аноним  
Дата: 10.10.13 12:20
Оценка:
Привет
Есть такой просой тест, который должен вернуть список неудаленных новостей.
Но он почему то возвращает все новости.
Что не так?

код бизнес логики

 public class AdminNewsController : Controller
    {
      
        private readonly IAdminNewsRepository repository;
        public AdminNewsController(IAdminNewsRepository newsRepository)
        {
            this.repository = newsRepository;
        }
        public ActionResult Index()
        {
            return View(repository.NewsList);
        }
    }
 
  public class EFAdminNewsRepository : IAdminNewsRepository
    {
        private readonly EFDbContext context = new EFDbContext();
        public IQueryable<News> NewsList
        {
            get
            {
                return context
                    .News
                    .Where(n => !n.IsDeleted)
                    .OrderByDescending(n => n.NewsID);
            }
        }
   }




код юнит теста

   private News[] complexNews = new News[]
                                  {
                                      new News {NewsID = 1, Description = "N1", Title = "T1"},
                                      new News {NewsID = 2, Description = "N2", Title = "T2", IsDeleted = true},
                                      new News {NewsID = 3, Description = "N3", Title = "T3"}
                                  };

        [TestMethod]
        public void Can_Get_Undeleted_News()
        {
            //Arrange
            Mock<IAdminNewsRepository> mock = new Mock<IAdminNewsRepository>();
            mock.Setup(m => m.NewsList).Returns(complexNews.AsQueryable);

            AdminNewsController controller = new AdminNewsController(mock.Object);

            //Act
            var res = ((IEnumerable<News>) ((ViewResult) controller.Index()).Model).ToList();

            //Assert
            Assert.IsNotNull(res);
            Assert.IsTrue(res.Count() == 2); здесь всегда 3 новости. должно быть 2
        }
Re: Непонятка с моками
От: . Великобритания  
Дата: 11.10.13 20:50
Оценка:
Здравствуйте, Аноним, Вы писали:


>
>             Assert.IsTrue(res.Count() == 2); здесь всегда 3 новости. должно быть 2
>         }
>

Не понял. Почему должно быть 2? Вроде всё правильно.
avalon/1.0.432
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[2]: Непонятка с моками
От: Аноним  
Дата: 13.10.13 06:04
Оценка:
Здравствуйте, ., Вы писали:

.>Здравствуйте, Аноним, Вы писали:



>>
>>             Assert.IsTrue(res.Count() == 2); здесь всегда 3 новости. должно быть 2
>>         }
>>

.>Не понял. Почему должно быть 2? Вроде всё правильно.

2 должно быть потому что

public IQueryable<News> NewsList
{
get
{
return context
.News
.Where(n => [b]!n.IsDeleted
)
.OrderByDescending(n => n.NewsID);
}
}[/b]
Re[3]: Непонятка с моками
От: . Великобритания  
Дата: 13.10.13 09:50
Оценка: +1
Здравствуйте, Аноним, Вы писали:
.>>Не понял. Почему должно быть 2? Вроде всё правильно.
А>2 должно быть потому что
А>
А>                    .Where(n => !n.IsDeleted)
А>

А каким магическим способом твой юнит-тест узнает о существовании EFAdminNewsRepository и выполнит этот код?
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[4]: Непонятка с моками
От: Аноним  
Дата: 13.10.13 12:47
Оценка:
Здравствуйте, ., Вы писали:

.>Здравствуйте, Аноним, Вы писали:

.>>>Не понял. Почему должно быть 2? Вроде всё правильно.
А>>2 должно быть потому что
А>>
А>>                    .Where(n => !n.IsDeleted)
А>>

.>А каким магическим способом твой юнит-тест узнает о существовании EFAdminNewsRepository и выполнит этот код?

а это разве неверно?

            Mock<IAdminNewsRepository> mock = new Mock<IAdminNewsRepository>();
            mock.Setup(m => m.NewsList).Returns(complexNews.AsQueryable);

            AdminNewsController controller = new AdminNewsController(mock.Object);


как надо?
Re[5]: Непонятка с моками
От: . Великобритания  
Дата: 13.10.13 13:19
Оценка:
Здравствуйте, Аноним, Вы писали:

А>а это разве неверно?

А>
А>            Mock<IAdminNewsRepository> mock = new Mock<IAdminNewsRepository>();
А>            mock.Setup(m => m.NewsList).Returns(complexNews.AsQueryable);

А>            AdminNewsController controller = new AdminNewsController(mock.Object);
А>

По-моему верно. И где здесь EFAdminNewsRepository? Как его код в принципе может влиять на поведение юнит-теста?

А>как надо?

А что надо-то?
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[6]: Непонятка с моками
От: Аноним  
Дата: 13.10.13 13:25
Оценка:
Здравствуйте, ., Вы писали:


А>>как надо?

.>А что надо-то?

Я в начале написал

Есть такой просой тест, который должен вернуть список неудаленных новостей.
Но он почему то возвращает все новости.


если не до конца понятно, то что свойство репозитория newsList возвращает только неудаленные новости
Re[7]: Непонятка с моками
От: . Великобритания  
Дата: 13.10.13 13:38
Оценка:
Здравствуйте, Аноним, Вы писали:

А>>>как надо?

.>>А что надо-то?
А>Я в начале написал
А>если не до конца понятно, то что свойство репозитория newsList возвращает только неудаленные новости
Я не понимаю что непонятного. У тебя есть код, который ни разу не выполняется в юнит-тесте. И ты хочешь что бы этот код как-то влиял на результат. Если хочешь, чтобы код что-то делал, его нужно выполнить.
Но для юнит-теста AdminNewsController код написан правильно. В юнит-тестах должен тестироваться ровно один класс, код других классов влиять не должен. Подумай что такое мок.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[7]: Непонятка с моками
От: _Raz_  
Дата: 13.10.13 13:40
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Есть такой просой тест, который должен вернуть список неудаленных новостей.

А>Но он почему то возвращает все новости.

Потому что ты мокаешь целиком свойство NewList, то есть оно превращается в
public IQueryable<News> NewsList
        {
            get
            {
                return new News[]
                                  {
                                      new News {NewsID = 1, Description = "N1", Title = "T1"},
                                      new News {NewsID = 2, Description = "N2", Title = "T2", IsDeleted = true},
                                      new News {NewsID = 3, Description = "N3", Title = "T3"}
                                  }
                                  ..AsQueryable();
            }
        }


Гугли entity framework fake
... << RSDN@Home (RF) 1.2.0 alpha 5 rev. 67>>
Re[8]: Непонятка с моками
От: Аноним  
Дата: 13.10.13 13:56
Оценка:
Здравствуйте, _Raz_, Вы писали:

_R_>Здравствуйте, <Аноним>, Вы писали:


А>>Есть такой просой тест, который должен вернуть список неудаленных новостей.

А>>Но он почему то возвращает все новости.

_R_>Потому что ты мокаешь целиком свойство NewList, то есть оно превращается в

_R_>
_R_>public IQueryable<News> NewsList
_R_>        {
_R_>            get
_R_>            {
_R_>                return new News[]
_R_>                                  {
_R_>                                      new News {NewsID = 1, Description = "N1", Title = "T1"},
_R_>                                      new News {NewsID = 2, Description = "N2", Title = "T2", IsDeleted = true},
_R_>                                      new News {NewsID = 3, Description = "N3", Title = "T3"}
_R_>                                  }
_R_>                                  ..AsQueryable();
_R_>            }
_R_>        }
_R_>


_R_>Гугли entity framework fake


thanks!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.