2011-01-11 28 views
15

Nói rằng tôi có một cái nhìn với đoạn mã sau ở phía trên cùng của trang:Có cách nào để kiểm tra đơn vị thuộc tính ASP.NET MVC ViewBag được đặt trong chế độ xem không?

@{ 
    ViewBag.Title = "About Us"; 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
} 

Và tôi có một phương pháp điều khiển:

public ActionResult About() 
    { 
     return View(); 
    } 

Làm thế nào tôi có thể kiểm tra xem ViewBag được thiết lập đúng?

Tôi đã thử mã sau.

[TestCase] 
public void About() 
{ 
    var controller = new AboutController(); 
    var ar = controller.About() as ViewResult; 
    Assert.AreEqual("About Us", ar.ViewBag.Title); 
} 

Nhưng tôi nhận được kết quả sau khi tôi chạy thử nghiệm:

Tests.Controllers.AboutControllerTests.About(): 
    Expected: "About Us" 
    But was: null 

Trả lời

4

Không, bạn không thể kiểm tra xem như thế này. Gần nhất bạn có thể nhận được là hiển thị chế độ xem thành trình ghi luồng và sau đó kiểm tra HTML được tạo. Nó không phải là một cái gì đó thường được thực hiện trong các bài kiểm tra đơn vị. Tôi khuyên bạn nên thực hiện các kiểm tra web để xác minh rằng các chế độ xem là chính xác. Bạn có thể tạo các thử nghiệm web với Visual Studio hoặc cũng có khung miễn phí Selenium.

+0

Tôi cũng sử dụng phương pháp ghi luồng/trình đọc luồng @Darin đề xuất. – neontapir

+0

Bất cứ ai xem điều này và từ bỏ việc giải quyết vấn đề, hãy cuộn xuống câu trả lời của @ phil.wheeler, nó đã giúp tôi! 'ViewData [yourKey]' hoặc 'ViewData [" Title "]' NB, điều này làm việc nếu bạn đặt giá trị 'Viewbag.Title' trong bộ điều khiển, không phải trong' cshtml' –

+0

Nó có thể kiểm tra được. Vui lòng chọn câu trả lời đúng – MJK

6

ViewResult được bộ điều khiển trả về chỉ có tham chiếu đến chế độ xem sẽ được hiển thị. Quan điểm thậm chí không được giải quyết tại thời điểm này. Mã không bao giờ được thực hiện bởi thử nghiệm của bạn.

Điều bạn cần làm là đặt thuộc tính ViewBag trong bộ điều khiển chứ không phải chế độ xem. Thông thường, chế độ xem sẽ chỉ đọc các giá trị như vậy.

hy vọng nó sẽ giúp

50

Kể từ khi cả hai ViewData và ViewBag sử dụng các mô hình lưu trữ tương tự, bạn sẽ có thể sử dụng ViewData[yourKey] trong các thử nghiệm của bạn.

Vì vậy, kiểm tra của bạn sẽ trông như thế này:

[TestCase] 
public void About() 
{ 
    var controller = new AboutController(); 
    var ar = controller.About() as ViewResult; 
    Assert.AreEqual("About Us", ar.ViewData["Title"]); 
} 
+0

Đây là câu trả lời. –

+0

Phương pháp này dường như hoạt động, nhưng chỉ khi bạn đang đặt giá trị 'ViewBag' trong bộ điều khiển –

16

Các bạn đã thử

Assert.AreEqual("About Us", controller.ViewBag.Title); 

Nó làm việc cho tôi

+0

Nó hoạt động, nhưng đó là cách đúng để khẳng định rằng khung nhìn đã có nó chưa? – DevDave

+0

Không, nó không phải là ... nếu xem ném một lỗi khi tải, bạn sẽ không biết nó bằng cách chỉ kiểm tra tiêu đề của bộ điều khiển. – levininja

2

Đối với những gì giá trị của nó, tôi thấy rằng những điều sau đây làm việc tốt:

Assert.AreEqual(_layout, result.ViewBag.Layout); 

Với resultViewResult

Các vấn đề liên quan