Как проверить ASP.NET Контроллер MVC и представление

#c# #visual-studio #unit-testing

Вопрос:

У меня есть простое ASP.NET Приложение MVC было написано в VS2019. Мне нужно запустить модульные тесты для этого контроллера, но я не получаю ошибку с самого начала. Ранее я проводил тесты для примера HomeController , и все прошло хорошо, теперь, когда я хочу повторить это, начинается лестница.

Мой контроллер:

 namespace WebApplication.Controllers
{
    public class BlobController : Controller
    {
        private readonly IBlobStorageRepository repo;

        public BlobController(IBlobStorageRepository _repo)
        {
            this.repo = _repo;
        }
        
        public ActionResult Index()
        {
            var blobVM = repo.GetBlobs();
            return View(blobVM);
        }

        public JsonResult RemoveBlob(string file, string extension)
        {
            bool isDeleted = repo.DeleteBlob(file, extension);
            return Json(isDeleted, JsonRequestBehavior.AllowGet);
        }

        public async Task<ActionResult> DownloadBlob(string file, string extension)
        {
            bool isDownloaded = await repo.DownloadBlobAsync(file, extension);
            return RedirectToAction("Index");
        }

        [HttpGet]
        public ActionResult UploadBlob()
        {
            return View();
        }

        [HttpPost]
        public ActionResult UploadBlob(HttpPostedFileBase uploadFileName)
        {
            bool isUploaded = repo.UploadBlob(uploadFileName);

            if(isUploaded == true)
            {
                return RedirectToAction("Index");
            }

            return View();
        }
    }
}
 

Тест на один метод:

 [TestClass]
public class BlobControllerTests
{
        [TestMethod]
        public void Index()
        {
            //Arrnage
           BlobController controller = new BlobController(); 
           //Act
           ViewResult result = controller.Index() as ViewResu<
           //Assert
           Assert.IsNotNull(result);
        }
}
 

Ошибка:

Для требуемого формального параметра «_repo»не было приведено никаких аргументов

Может ли кто-нибудь помочь мне с тестированием всего этого контроллера?

Я также хотел бы проверить представление, возможно ли это? Если да, то прошу конкретных советов.

Вид:

 @model IEnumerable<WebApplication2.Models.BlobViewModel>
@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";
}



<div class="container">
    @Html.ActionLink("Upload to Azure Blob", "UploadBlob", new { controller = "Blob" }, new {@class = "btn btn-link"})

    <div class="table table-striped table-responsive">

     <table id="tablex">
         <thead>
             <tr>
                 <th>Container</th>
                 <th>Actual FileName</th>
                 <!--<th>Uri</th>-->
             </tr>
         </thead>

         <tbody>
             @if(Model != null)
             {
                 foreach(var item in Model)
                {
             <tr id="row_@item.PrimaryUri">
                 <td>@item.BlobContainerName</td>
                 <td>@item.ActualFileName</td>
                 <!--
    <td>
        <a href=@item.PrimaryUri>@item.PrimaryUri </a>
    </td>-->
                 <td>@Html.ActionLink("Download", "DownloadBlob", new { controller = "Blob", file = @item.FileNameWithoutExt, extension = @item.FileNameExtensionOnly }, new { @class = "btn btn-link" }) </td>
                 <td>
                     <input type="submit" href="#" class="btn btn-link" id="btndel" value="Remove" data-id="@item.ActualFileName" />
                 </td>
             </tr>
                    
                }
             }
         </tbody>
     </table>    
    </div>
</div>

@section scripts{

    <script type="text/javascript">
        debugger
        $(document).ready(function () {
            $('table tbody tr td input[type="submit"]').click(function () {

                var fileName = $(this).attr("data-id")
                var ext = fileName.split('.').pop();
                var file = fileName.substr(0, fileName.lastIndexOf('.'));
                var tr = $(this).closest('tr');

                var msgx = confirm("are u sure to delete?");
                if (msgx) {
                    $.ajax({
                        type: "post",
                        url: '@Url.Action("RemoveBlob", "Blob")',
                        data: { file: file, extension: ext },
                        success: function (response) {
                            if (response == true) {
                                tr.remove();
                            }
                        }
                    });
                }
            });
        });
    </script>
    }
 

Комментарии:

1. Для тестирования вашего контроллера — BlobController controller = new BlobController(); линии необходимо указать IBlobStorageRepository объект в качестве параметра. Вы, наверное, хотите посмеяться над этим.

2. Я использую контроллер блобконтроллера = новый блобконтроллер(_repo: IBlobStorageRepository); и это неправильный тип

3. Вам нужно узнать о том, как издеваться над зависимостью для модульного тестирования

Ответ №1:

Попробуйте это

 [TestClass]
public class BlobControllerTests
{
        private Mock<IBlobStorageRepository> repo { get; set; } = new Mock<IBlobStorageRepository>();

        [TestMethod]
        public void Index()
        {
            // Arrange
            BlobController controller = new BlobController(_repo: repo.Object); 
            // Act
            ViewResult result = controller.Index() as ViewResu<
            // Assert
            Assert.IsNotNull(result);
        }
}
 

Комментарии:

1. Это, работает! Не могли бы вы помочь мне с тестовым просмотром?