2009-10-29 27 views
5

Tôi gặp sự cố khi trả về giá trị Phiên được đặt từ chế độ nhạo báng bằng cách sử dụng Moq. Sử dụng sauMoq Mocking và theo dõi Giá trị phiên

public class TestHelpers 
{ 
public long sessionValue = -1; 
public HttpContextBase FakeHttpContext() 
{ 

    var httpContext = new Mock<HttpContextBase>(); 
    var session = new Mock<HttpSessionStateBase>(); 
    httpContext.Setup(x => x.Session).Returns(session.Object); 
    httpContext.SetupGet(x => x.Session["id"]).Returns(sessionValue); 
    httpContext.SetupSet(x => x.Session["id"] = It.IsAny<long>()) 
     .Callback((string name, object val) => 
     { 
      sessionValue = (long)val; 
     }); 
    } 
} 

Khi tôi cố gắng để có được những giá trị bên ngoài sử dụng

var th = new TestHelpers(); 
HttpContextBase httpContext = th.FakeHttpContext(); 

làm một số nội dung mà bộ Session [ "id"]

var sessionid = httpContext.Session["id"]; 

sessionid hóa ra là -1. Nhưng tôi có thể nhận được giá trị phiên đã đặt bằng cách sử dụng

th.sessionValue 

Có vấn đề gì? Tôi không thể trả lại giá trị đã đặt thông qua Moq?

Trả lời

11

Tôi cần dừng trả lời các câu hỏi của riêng mình. Nó chỉ ra rằng tôi cần thiết để chế nhạo Session [ "id"] một lần nữa như vậy ...

httpContext.SetupSet(x => x.Session["id"] = It.IsAny<long>()) 
     .Callback((string name, object val) => 
     { 
      sessionValue = (long)val; 
      httpContext.SetupGet(x => x.Session["id"]).Returns(sessionValue); 
     }); 
+0

Điều này không hiệu quả đối với tôi: @Konamimam có vẻ đúng là .Callback không bị sa thải. Cách tiếp cận chính xác dường như ở đây: http://stackoverflow.com/a/2921695/213609 –

2

Phương thức Moq's Setup không hoạt động với các thuộc tính được lập chỉ mục có chỉ mục chuỗi. Xem tại đây: How to MOQ an Indexed property

+0

nếu nó không hoạt động thì không nên Session ["id"] trả về null và không -1? – sean

+0

Ngoài ra, câu trả lời cho câu hỏi mà bạn liên kết với dường như cho biết nó hoạt động? –

1

Đó là bởi vì bạn đang trở về giá trị trong getter mà đã được thông qua bởi giá trị. Vì vậy, mỗi khi bạn gọi getter, bạn nhận được cùng một giá trị trả về.

Thay đổi Returns() để sử dụng một đại biểu để nó được đánh giá mỗi lần. Bằng cách đó, bạn sẽ nhận được giá trị chính xác mỗi lần :)

Dễ dàng hơn nhiều so với mắt so với một SetupGet được nhúng bên trong SetupSet.

httpContext.SetupSet(x => x.Session["id"] = It.IsAny<long>()) 
     .Callback((string name, object val) => sessionValue = (long)val); 
httpContext.SetupGet(x => x.Session["id"]).Returns(() => sessionValue); 
1

tôi chỉ cần bỏ ra thời gian dài cố gắng tìm ra cách dễ nhất để làm điều đó với moq, dưới đây là một quá khứ bản sao của mã của tôi mà thực sự làm việc cho tôi:

var _adminctrl = new Moq.Mock<AdminController>(); //AdminController is my MVC controller 

var mock = new Mock<ControllerContext>(); 
mock.Object.Controller = _adminctrl.Object; 
mock.Setup(p => p.HttpContext.Session["UserInfoKey"]).Returns(new ViewModel()); 
//here is the catch, attaching the ControllerContext to your controller 
_adminctrl.Object.ControllerContext = mock.Object; 

hy vọng điều này giúp!

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