Форум программистов, компьютерный форум, киберфорум
C#: ASP.NET MVC
Войти
Регистрация
Восстановить пароль
Другие темы раздела
C# MVC Не могу получить доступ к ячейкам sql таблицы https://www.cyberforum.ru/ asp-net-mvc/ thread2250937.html
в процессе работы с таблицами приходилось их изменять даже удалять и переписывать снова. Сначала всё было нормально но после ряда изменений не смог получить доступ к данным которые в них хранятся....
C# MVC Обработка ошибок при работе с RSS
Здравствуйте. Тяну RSS новости на сайт, всё успешно. Но как только ресурс с новостями не доступен, или же просто в конфиге нет ссылки на поток - страница попросту не стартует. Начал разбираться, итог...
C# MVC Выдает ошибку "HttpContextBase не содержит определения для GetOwinContext" https://www.cyberforum.ru/ asp-net-mvc/ thread2248681.html
public ApplicationSignInManager SignInManager { get { return _signInManager ?? // тут выдает ошибку ...
C# MVC Система комментариев с использованием jQuery Привет. Пишу блог. Есть модель Post : using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Web.Mvc; namespace Common.Models https://www.cyberforum.ru/ asp-net-mvc/ thread2248374.html
C# MVC Готовые проекты, шаблоны ASP MVC
Привет. Если база готовых проектов, шаблонов? я бы хотел купить или бесплатно скачать, не могу найти...
C# MVC Редактирование объектов из List https://www.cyberforum.ru/ asp-net-mvc/ thread2248129.html
Доброго времени суток. Решил сделать страницу для добавления теста с вопросами. Класс Question, отвечающий за вопросы: public int QuestionId { get; set; } public int TestId { get;...
C# MVC ЧПУ - как сделать все ссылки второго уровня Вопрос, как правильно составить модель данных и routing, при использовании Enity и code first, чтоб все ссылки были второго уровня domen.ltd/link1 domen.ltd/link2 Получается есть несколько модели... https://www.cyberforum.ru/ asp-net-mvc/ thread2247666.html Выпадающий список с нестандартным стилем C# MVC
Здравствуйте. Такая проблема: нужен выпадающий список из таблицы БД. Но при этом чтобы его стиль был не стандартный. Подключила стиль, добавляю данные в список с помощью foreach. Данные выводятся,...
C# MVC Обращение к загруженному файлу Пользователь загружает файл через форму (в моем случае изображение). Он сохраняется у меня в папке на сервере. Но потом мне нужно обработать это изображение, но я не знаю как к нему обратиться. ... https://www.cyberforum.ru/ asp-net-mvc/ thread2246532.html C# MVC Сессии. Смена состояния online/offline https://www.cyberforum.ru/ asp-net-mvc/ thread2246377.html
Ситуация следующая. Механизм аутентификации/авторизации и раздачи ролей реализован с помощью Identity. Есть пользователи, у каждого есть поле состояния - online/offline. При неактивности...
C# MVC Создание таблицы со связью многие-ко-многим
Здравствуйте, помогите разобраться. Возможно ли подключиться таблице(Timetable) к таблице(Group), через табл. многие-ко многим(GroupTT), через Include. Хочу вывести в таблице(Timetable) группу +...
C# MVC Передача изображения из MVC на WebApi https://www.cyberforum.ru/ asp-net-mvc/ thread2245871.html
Привет, есть два метода, один отправляет изображение, другой принимает. Вот они. Метод отправки на MVC. public static async Task<bool> SetImage(byte buff, string name) { ...
2 / 2 / 2
Регистрация: 21.10.2016
Сообщений: 68
0

Unit Tests для проекта с Unit Of Work - C# MVC - Ответ 12415924

24.05.2018, 09:57. Показов 674. Ответов 1
Метки (Все метки)

Привет.
Вынужден снова обратиться за помощью.
Пишу блог.
Архитектура такова, что есть IRepository , PostRepository и Unit OfWork.
Я только - только начал знакомиться с unit tests и не могу понять как правильно тестить методы.
От Вас очень прошу помочь с созданием только одного теста - возвращение списка всех постов в блоге, остальные доделаю сам.
Приведу Листинги:

PostController:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
namespace WebSite.Controllers
{
    public class PostsController : Controller
    {
        readonly UnitOfWork unitOfWork;
 
        public ActionResult Index()
        {
            var postList = unitOfWork.Post.GetList();
            return View( postList );
        }
 
 
        public ActionResult Details( int? id )
        {
            if (id == null)
            {
                return new HttpStatusCodeResult( HttpStatusCode.BadRequest );
            }
            var post = unitOfWork.Post.Get( id );
            if (post == null)
            {
                return HttpNotFound();
            }
            return View( post );
        }
 
        public ActionResult Create()
        {
            return View();
        }
 
 
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create(
            [Bind( Include = "Id,Title,Description,Content,Category,PostedDateTime,ModifiedDateTime" )] Post post, HttpPostedFileBase file )
        {
 
            post.Author = User.Identity.Name;
            if (!ModelState.IsValid || file == null)
                return View( post );
            //attach the uploaded image to the object before saving to Database
            post.ImageMimeType = "image / jpeg" /*image.ContentLength*/;
            post.ImageData = new byte[file.ContentLength];
            file.InputStream.Read( post.ImageData, 0, file.ContentLength );
 
            //Save image to file
            var filename = file.FileName;
            var filePathOriginal = Server.MapPath( "~/Images/Original" );
            var savedFileName = Path.Combine( filePathOriginal, filename );
            file.SaveAs( savedFileName );
 
            //Read image back from file and create thumbnail from it
            var imageFile = Path.Combine( Server.MapPath( "~/Images/Original" ), filename );
            using (var srcImage = Image.FromFile( imageFile ))
            using (var newImage = new Bitmap( 100, 100 ))
            using (var graphics = Graphics.FromImage( newImage ))
            using (var stream = new MemoryStream())
            {
                graphics.SmoothingMode = SmoothingMode.AntiAlias;
                graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
                graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
                graphics.DrawImage( srcImage, new Rectangle( 0, 0, 100, 100 ) );
                newImage.Save( stream, ImageFormat.Png );
                var thumbNew = File( stream.ToArray(), "image/png" );
                post.ImageThumbnail = thumbNew.FileContents;
            }
            post.PostedDateTime = DateTime.Now;
            unitOfWork.Post.Create( post );
            unitOfWork.Save();
            return RedirectToAction( "Index", "Home" );
        }
 
        [HttpGet]
        public ActionResult Edit( int? id )
        {
            if (id == null)
            {
                return new HttpStatusCodeResult( HttpStatusCode.BadRequest );
            }
            var post = unitOfWork.Post.Get( id );
            if (post == null)
            {
                return HttpNotFound();
            }
            return View( post );
        }
 
 
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Edit(
            [Bind( Include = "Id,Title,Description,Content,Category,Author,ImageData,ImageThumbnail,ImageMimeType,PostedDateTime,ModifiedDateTime" )] Post post, HttpPostedFileBase file )
        {
            if (!ModelState.IsValid)
                return View( post );
            if (file != null)
            {
                //attach the uploaded image to the object before saving to Database
                post.ImageMimeType = "image / jpeg" /*image.ContentLength*/;
                post.ImageData = new byte[file.ContentLength];
                file.InputStream.Read( post.ImageData, 0, file.ContentLength );
 
                //Save image to file
                var filename = file.FileName;
                var filePathOriginal = Server.MapPath( "~/Images/Original" );
                var savedFileName = Path.Combine( filePathOriginal, filename );
                file.SaveAs( savedFileName );
 
                //Read image back from file and create thumbnail from it
                var imageFile = Path.Combine( Server.MapPath( "~/Images/Original" ), filename );
                using (var srcImage = Image.FromFile( imageFile ))
                using (var newImage = new Bitmap( 350, 200 ))
                using (var graphics = Graphics.FromImage( newImage ))
                using (var stream = new MemoryStream())
                {
                    graphics.SmoothingMode = SmoothingMode.AntiAlias;
                    graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
                    graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
                    graphics.DrawImage( srcImage, new Rectangle( 0, 0, 350, 200 ) );
                    newImage.Save( stream, ImageFormat.Png );
                    var thumbNew = File( stream.ToArray(), "image/png" );
                    post.ImageThumbnail = thumbNew.FileContents;
                }
            }
            unitOfWork.Post.Edit( post );
            unitOfWork.Save();
            return RedirectToAction( "Index", "Home" );
        }
 
        public ActionResult Delete( int? id )
        {
            if (id == null)
            {
                return new HttpStatusCodeResult( HttpStatusCode.BadRequest );
            }
            var post = unitOfWork.Post.Get( id );
            if (post == null)
            {
                return HttpNotFound();
            }
            return View( post );
        }
 
        [HttpPost, ActionName( "Delete" )]
        [ValidateAntiForgeryToken]
        public ActionResult DeleteConfirmed( int id )
        {
            {
                var post = unitOfWork.Post.Get( id );
                unitOfWork.Post.Delete( post );
                unitOfWork.Save();
                return RedirectToAction( "Index" );
            }
        }
        public FileContentResult GetThumbnailImage( int? id )
        {
            var post = unitOfWork.Post.Get( id );
            if (post.ImageThumbnail != null)
            {
                return File( post.ImageThumbnail, post.ImageMimeType );
            }
            else if (post.ImageThumbnail == null && post.ImageData == null)
            {
                var imageFile = Path.Combine( Server.MapPath( "~/Images/Original/NoImageAvailable.jpg" ) );
                post.ImageMimeType = "image / jpeg";
                using (var srcImage = Image.FromFile( imageFile ))
                using (var newImage = new Bitmap( 350, 200 ))
                using (var graphics = Graphics.FromImage( newImage ))
                using (var stream = new MemoryStream())
                {
                    graphics.SmoothingMode = SmoothingMode.AntiAlias;
                    graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
                    graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
                    graphics.DrawImage( srcImage, new Rectangle( 0, 0, 350, 200 ) );
                    newImage.Save( stream, ImageFormat.Png );
                    var thumbNew = File( stream.ToArray(), "image/png" );
                    post.ImageThumbnail = thumbNew.FileContents;
                }
                return File( post.ImageThumbnail, post.ImageMimeType );
            }
            else 
            {
                var imageFile = Path.Combine( Server.MapPath( "~/Images/Default" ), post.DefaultImageName );
                using (var srcImage = Image.FromFile( imageFile ))
                using (var newImage = new Bitmap( 350, 200 ))
                using (var graphics = Graphics.FromImage( newImage ))
                using (var stream = new MemoryStream())
                {
                    graphics.SmoothingMode = SmoothingMode.AntiAlias;
                    graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
                    graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
                    graphics.DrawImage( srcImage, new Rectangle( 0, 0, 350, 200 ) );
                    newImage.Save( stream, ImageFormat.Png );
                    var thumbNew = File( stream.ToArray(), "image/png" );
                    post.ImageThumbnail = thumbNew.FileContents;
                }
                return File( post.ImageThumbnail, post.ImageMimeType );
            }
        }
        public ActionResult ChangeStatus( int id )
        {
            var post = unitOfWork.Post.Get( id );
            if (post != null && post.IsDeclined || post != null && !post.IsApproved)
            {
                post.IsDeclined = false;
                post.IsApproved = true;
            }
            else if (post != null && post.IsApproved || post !=null && !post.IsDeclined)
            {
                post.IsApproved = false;
                post.IsDeclined = true;
            }
            unitOfWork.Post.Edit( post );
            unitOfWork.Save();
            return RedirectToAction( "Index","Home" );
        }
    }
}
PostRepository:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using Common.App_Data;
using Common.Models;
 
namespace Common.Services.Repositories
{
    public class PostRepository : IRepository<Post>, IDisposable
    {
        private BlogContext db;
 
        public PostRepository( BlogContext context)
        {
            db = context;
        }
 
 
        public IEnumerable<Post> GetList()
        {
            return db.Posts.ToList();
        }
 
        public Post Get(int? id)
        {
            return db.Posts.Find( id );
        }
 
        public void Create( Post post ) // create object--Action : Posts/Create
        {
            post.PostedDateTime = DateTime.Now;
            db.Posts.Add( post );
        }
 
        public void Delete( Post post ) // delete object --Action : Posts/Delete 
        {
            if (post == null) return;
            db.Posts.Remove(post);
        }
 
        public void Edit( Post post ) // edit object--Action : Posts/Edit
        {
            post.ModifiedDateTime = DateTime.Now;
            db.Entry( post ).State = EntityState.Modified;
        }
       
       private bool disposed = false;
        public virtual void Dispose( bool disposing )
        {
            if (!disposed)
            {
                if (disposing)
                {
                    db.Dispose();
                }
                disposed = true;
            }
        }
        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize( this );
        }
 
       
    }
}
IRepository:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
using System.Collections.Generic;
 
namespace Common.Services.Repositories
{
    public interface IRepository<T> where T : class
    {
        IEnumerable<T> GetList();
        T Get(int? id); 
        void Create(T item); 
        void Edit(T item);
        void Delete( T item ); 
 
    }
}
UnitOfWork:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
using System;
using System.Data.Entity.Validation;
using System.Linq;
using Common.App_Data;
 
namespace Common.Services.Repositories
{
    public class UnitOfWork : IDisposable
    {
        private BlogContext db;
        private PostRepository postRepository;
 
        public PostRepository Post => postRepository ?? (postRepository = new PostRepository(db));
 
 
        public void Save()
        {
            try
            {
                db.SaveChanges();
            }
            catch (DbEntityValidationException dbEx)
            {
                var raise = dbEx.EntityValidationErrors.Aggregate<DbEntityValidationResult, Exception>(dbEx, (current1, validationErrors) => 
                validationErrors.ValidationErrors.Select(validationError =>
                $"{validationErrors.Entry.Entity.ToString()}:{validationError.ErrorMessage}").Aggregate(current1, (current, message) => 
                new InvalidOperationException(message, current)));
                throw raise;
            }
        }
 
        private bool disposed = false;
 
       public virtual void Dispose( bool disposing )
        {
            if (disposed) return;
            if (disposing)
            {
                db.Dispose();
            }
            disposed = true;
        }
 
        public void Dispose()
        {
            Dispose( true );
            GC.SuppressFinalize( this );
        }
    }
}
Ну и вот собственно в первом тесте я хочу протестить , что при выполнении метода GetList() возвращается список постов (Да вообще - или результат не нулевой), наверное тут надо использовать моки , но я начал с ними и бытро стал путаться, потом решил , что чем проще -тем лучше. Тест не проходит((

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using Common.Services.Repositories;
using Microsoft.VisualStudio.TestTools.UnitTesting;
 
namespace UnitTests.Test
{
    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void GetListOfPostsReturnsNotNull()
        {
            //Arrange
            var unitOfWork = new UnitOfWork();
            //Act
            var testList = unitOfWork.Post.GetList();
            //Asset
            Assert.IsNotNull(testList);
        }
    }
}
Добавлено через 2 часа 57 минут
Гайз, ну вы же на опыте) Ну сам принцип правильный подскажите, пожалуйста.

Добавлено через 15 часов 3 минуты
Вот такой еще варик, но тоже не работает(:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
[TestMethod]
        public void GetListOfPostsReturnsNotNull()
        {
            //Arrange
            var mockDb = new Mock<BlogContext>();
            var mockRep = new Mock<PostRepository>();
            var unitOfWork = new UnitOfWork(mockDb.Object,mockRep.Object);
 
            //Act
            var testList = unitOfWork.Post.GetList();
            //Asset
            Assert.IsNotNull(testList);
        }


Вернуться к обсуждению:
Unit Tests для проекта с Unit Of Work C# MVC
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.05.2018, 09:57
Готовые ответы и решения:

Конструктор контроллера Unit of Work
Помогите, пожалуйста, понять, как мне связать сервисы с контроллером. Класс лежит в отдельной...

Unit Tests
У меня 2005 студия pro и на ней нету unit test'ов. можно где-то скачать инструмент. чтоб не ставить...

Unit tests
Добрый день. Кто-нибудь сталкивался с написанием unit тестов? Кто может посоветовать литературу или...

Android unit tests
Всем привет, хочу получить различные точки зрения по вопросу автоматизированного тестирования. А...

1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.05.2018, 09:57

Python unit tests в maven
Есть Maven-проект, в котором есть некоторые питоновские скрипты. Для тестирования этих скриптов...

Ошибка в Unit Tests (CppUnitTestFramework)
Пытаюсь написать 3 юнит теста. При билде получаю ошибку fatal error LNK1120: 1 unresolved...

Модульные тесты *unit tests
Какие полезные модульные тесты (unit tests) можно написать можно написать для загрузки данных из...

Maven packaging war before unit tests
Собственно сабж. Использую maven-surefire-plugin для запуска юнит тестов, maven-war-plugin для...

0
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru