如何使用垫片和/或最小起订量模拟服务器传输方法
How to mock out the server transfer method using shims and or Moq
我正在尝试模拟以下传输请求。
我尝试过使用 Moq,但它不喜欢它是一个方法调用这一事实。有任何想法吗?
我试过使用垫片,但它对我来说并不完全有意义。 https://social.msdn.microsoft.com/Forums/vstudio/en-US/4e423407-300d-46ba-bfc9-30465fb18f07/how-to-fake-httpcontextcurrent-using-shim?forum=vstest
我尝试以这种方式模拟 http 上下文,但它也没有用。
https://justinchmura.com/2014/06/26/mock-httpcontext/
public class MyModule1 : IHttpModule
{
/// <summary>
/// You will need to configure this module in the Web.config file of your
/// web and register it with IIS before being able to use it. For more information
/// see the following link: https://go.microsoft.com/?linkid=8101007
/// </summary>
#region IHttpModule Members
public void Dispose()
{
//clean-up code here.
}
public void Init(HttpApplication context)
{
// Below is an example of how you can handle LogRequest event and provide
// custom logging implementation for it
context.LogRequest += new EventHandler(OnLogRequest);
context.BeginRequest += new EventHandler(OnBeginRequest);
}
private void OnBeginRequest(object sender, EventArgs e)
{
onbegin(new HttpContextWrapper(((HttpApplication)sender).Context));
}
private void onbegin(HttpContextBase context)
{
// other header stuff goes here
context.Server.TransferRequest("bobsyouruncle", true);
}
#endregion
public void OnLogRequest(Object source, EventArgs e)
{
//custom logging logic can go here
}
类似于我在此处提供的答案中采用的方法
您可以创建一个工厂 method/function,将当前紧密耦合的实现问题包装在抽象中,从而实现更好的模拟和可测试性
重构模块
public class MyModule1 : IHttpModule {
public void Dispose() {
//clean-up code here.
}
public void Init(HttpApplication application) {
// Below is an example of how you can handle LogRequest event and provide
// custom logging implementation for it
application.LogRequest += new EventHandler(OnLogRequest);
application.BeginRequest += new EventHandler(OnBeginRequest);
}
public Func<object, HttpContextBase> GetContext = (object sender) => {
return new HttpContextWrapper(((HttpApplication)sender).Context);
};
public void OnBeginRequest(object sender, EventArgs e) {
var context = GetContext(sender);
onbegin(context);
}
private void onbegin(HttpContextBase context) {
// other header stuff goes here
context.Server.TransferRequest("bobsyouruncle", true);
}
public void OnLogRequest(Object source, EventArgs e) {
//custom logging logic can go here
}
//...
}
测试使用 mock 时可以替换 GetContext
工厂函数。
例如
[TestMethod]
public void Server_Should_Transfer() {
//Arrange
var server = new Mock<HttpServerUtilityBase>();
var context = new Mock.<HttpContextBase>();
context.Setup(_ => _.Server).Returns(server.Object);
var sut = new MyModule1();
//replace with mock context for test
sut.GetContext = (object sender) => context.Object;
//Act
sut.OnBeginRequest(new object(), EventArgs.Empty);
//Assert
server.Verify(_ => _.TransferRequest("bobsyouruncle", true), Times.AtLeastOnce);
}
我正在尝试模拟以下传输请求。
我尝试过使用 Moq,但它不喜欢它是一个方法调用这一事实。有任何想法吗?
我试过使用垫片,但它对我来说并不完全有意义。 https://social.msdn.microsoft.com/Forums/vstudio/en-US/4e423407-300d-46ba-bfc9-30465fb18f07/how-to-fake-httpcontextcurrent-using-shim?forum=vstest 我尝试以这种方式模拟 http 上下文,但它也没有用。 https://justinchmura.com/2014/06/26/mock-httpcontext/
public class MyModule1 : IHttpModule
{
/// <summary>
/// You will need to configure this module in the Web.config file of your
/// web and register it with IIS before being able to use it. For more information
/// see the following link: https://go.microsoft.com/?linkid=8101007
/// </summary>
#region IHttpModule Members
public void Dispose()
{
//clean-up code here.
}
public void Init(HttpApplication context)
{
// Below is an example of how you can handle LogRequest event and provide
// custom logging implementation for it
context.LogRequest += new EventHandler(OnLogRequest);
context.BeginRequest += new EventHandler(OnBeginRequest);
}
private void OnBeginRequest(object sender, EventArgs e)
{
onbegin(new HttpContextWrapper(((HttpApplication)sender).Context));
}
private void onbegin(HttpContextBase context)
{
// other header stuff goes here
context.Server.TransferRequest("bobsyouruncle", true);
}
#endregion
public void OnLogRequest(Object source, EventArgs e)
{
//custom logging logic can go here
}
类似于我在此处提供的答案中采用的方法
您可以创建一个工厂 method/function,将当前紧密耦合的实现问题包装在抽象中,从而实现更好的模拟和可测试性
重构模块
public class MyModule1 : IHttpModule {
public void Dispose() {
//clean-up code here.
}
public void Init(HttpApplication application) {
// Below is an example of how you can handle LogRequest event and provide
// custom logging implementation for it
application.LogRequest += new EventHandler(OnLogRequest);
application.BeginRequest += new EventHandler(OnBeginRequest);
}
public Func<object, HttpContextBase> GetContext = (object sender) => {
return new HttpContextWrapper(((HttpApplication)sender).Context);
};
public void OnBeginRequest(object sender, EventArgs e) {
var context = GetContext(sender);
onbegin(context);
}
private void onbegin(HttpContextBase context) {
// other header stuff goes here
context.Server.TransferRequest("bobsyouruncle", true);
}
public void OnLogRequest(Object source, EventArgs e) {
//custom logging logic can go here
}
//...
}
测试使用 mock 时可以替换 GetContext
工厂函数。
例如
[TestMethod]
public void Server_Should_Transfer() {
//Arrange
var server = new Mock<HttpServerUtilityBase>();
var context = new Mock.<HttpContextBase>();
context.Setup(_ => _.Server).Returns(server.Object);
var sut = new MyModule1();
//replace with mock context for test
sut.GetContext = (object sender) => context.Object;
//Act
sut.OnBeginRequest(new object(), EventArgs.Empty);
//Assert
server.Verify(_ => _.TransferRequest("bobsyouruncle", true), Times.AtLeastOnce);
}