C# 如何对内部使用System.Web.Security.Membership的方法进行单元测试?

C# 如何对内部使用System.Web.Security.Membership的方法进行单元测试?,c#,mocking,moq,C#,Mocking,Moq,我想测试一个方法,以检查它是否正确保存了事务。它在内部调用Membership.GetUser()来验证每次导致测试失败的用户。是否有任何方法可以模拟此操作,以便Membership.GetUser()始终返回有效的名称 我使用的是Moq、C#和ASP.NET4.5MVC,简而言之,你不能。这就是为什么对这样一个“服务”的每次调用都应该隐藏在一个抽象背后 您可以在默认的MVC模板中看到一个示例。是的,就像Serg所说的,您可以通过提供一个接口来模拟实际服务的实现。此接口将具有您正在调用的公共方法

我想测试一个方法,以检查它是否正确保存了事务。它在内部调用Membership.GetUser()来验证每次导致测试失败的用户。是否有任何方法可以模拟此操作,以便Membership.GetUser()始终返回有效的名称


我使用的是Moq、C#和ASP.NET4.5MVC,简而言之,你不能。这就是为什么对这样一个“服务”的每次调用都应该隐藏在一个抽象背后


您可以在默认的MVC模板中看到一个示例。

是的,就像Serg所说的,您可以通过提供一个接口来模拟实际服务的实现。此接口将具有您正在调用的公共方法,例如:

public interface IMyServiceInterface
{
    IMembershipUser GetUser();
    // other methods you want to use...
}
在单元测试中,您会说:

var mockService = new Mock<IServiceInterface>();
mockService.Setup(mock => mock.GetUser()).
    Returns(new MembershipUserImplementation("MyTestUser", otherCtorParams));
var mockService=new Mock();
mockService.Setup(mock=>mock.GetUser()。
返回(new MembershipUserImplementation(“MyTestUser”,OtherTorParams));

在我的示例中,我将为MembershipUser创建一个包装器,而且它似乎还需要在抽象后面。

您能详细说明一下吗?该模板使用WebSecurity.Login()。有什么好的方法可以将其抽象出来,这样单元测试就不会真正命中数据库?发现这看起来很有希望:。这就是您正在谈论的抽象吗?您在示例中使用的是哪种模拟框架?我使用。它很简单,做了我需要它做的一切。