我正在为一些 C# 代码追溯记录和编写单元测试。我想确定实际使用了什么代码以及何时使用。
在 Visual Studio 2012 中,有没有办法在遍历特定场景时记录所有访问的方法以及按什么顺序?
我正在为一些 C# 代码追溯记录和编写单元测试。我想确定实际使用了什么代码以及何时使用。
在 Visual Studio 2012 中,有没有办法在遍历特定场景时记录所有访问的方法以及按什么顺序?
您可以使用附加的分析器运行您的应用程序,它将为您提供所有访问的方法、调用链、计数等。
Visual Studio Profiler将为您提供每个方法所花费的时间,并让您检查调用层次结构。我不知道它是否会给你他们被调用的确切顺序。
编辑:显然在 VS2012 中将探查器附加到正在运行的单元测试更难。
您是否要执行一个测试方法以确保调用了类上的特定方法?如果是这样,我不知道单独在 VS 中执行此操作的方法,但是您可以使用模拟框架来创建依赖模拟并检查它们的值。这是一个单元测试的片段:
[TestMethod]
public void HttpPostPrivacyPolicyFacadeSvcErrorTest()
{
var controller = ControllerHelper.GetRouteController();
controller.Session[SessionVariable.User] = new UserInfo() { UserName = Config.Data.Username };
var idmSvcMock = new Mock<IUserServiceDAO>();
var facadeSvcMock = new Mock<IFacadeSvcDAO>();
//setup the facade mock to throw exception to simulate FacadeServiceException
facadeSvcMock.Setup(x => x.SetPrivacyAcceptanceStatus(It.IsAny<UserInfo>())).Throws<Exception>();
var userCollectorMock = new Mock<IUserInfoCollector>();
userCollectorMock.Setup(x => x.GetUserInfo()).Returns(new UserInfo() { UserName = Config.Data.Username });
controller.FacadeSvc = facadeSvcMock.Object;
controller.UserServiceDAO = idmSvcMock.Object;
controller.UserCollector = userCollectorMock.Object;
controller.DefaultErrorId = "Route_errors_Unabletoprocess";
//action
var res = controller.Privacy(new FormCollection());
//assert
//make sure we go to the right controller, action, with the correct params.
res.AssertActionRedirect().ToController("Errors").ToAction("Index").WithParameter("id", "Route_errors_Unabletoprocess");
//did we call setprivacy once on the mock?
facadeSvcMock.Verify(x => x.SetPrivacyAcceptanceStatus(It.IsAny<UserInfo>()), Times.Exactly(1));
在上面的测试中,我检查了 SetPrivacyAcceptance 是否在我的 facadeSvcMock 实例上被调用了一次且仅一次。更多关于起订量在这里:起订量
这段代码实际上是检查 SetPrivacyAcceptanceStatus 被调用了多少次://我们是否在模拟中调用了一次 setprivacy?facadeSvcMock.Verify(x => x.SetPrivacyAcceptanceStatus(It.IsAny()), Times.Exactly(1));
It.IsAny() 是该方法的一个参数,因此上面的行基本上说“对于 UserInfo 类型的任何输入参数,请验证我们是否只调用了一次 SetPrivacyAcceptanceStatus。”