.NET有很多单元测试框架.我找到了这个小功能比较:http://xunit.github.io/docs/comparisons.html
现在我要为我们选择最好的一个.但是怎么样?有关系吗?哪一个是最具前瞻性的证据,背后有一个不错的动力?我应该关心这些功能吗?虽然xUnit似乎是最现代的,专为.NET设计,但NUnit似乎再次被广泛接受.MSTest再次集成到Visual Studio中......
我将在工作中启动一个新项目,并希望进入单元测试.我们将使用VS 2008,C#和ASP.NET MVC.我正在考虑使用NUnit或VS2008具有的内置测试项目,但我愿意研究其他建议.一个系统比另一个系统更好,或者比另一个更容易使用/理解?我希望将这个项目设置为我们未来发展努力的"最佳实践".
感谢您的帮助和建议!!
我有这样的测试:
[TestCase("~/page/myaction")]
public void Page_With_Custom_Action(string path) {
// Arrange
var pathData = new Mock<IPathData>();
var pageModel = new Mock<IPageModel>();
var repository = new Mock<IPageRepository>();
var mapper = new Mock<IControllerMapper>();
var container = new Mock<IContainer>();
container.Setup(x => x.GetInstance<IPageRepository>()).Returns(repository.Object);
repository.Setup(x => x.GetPageByUrl<IPageModel>(path)).Returns(() => pageModel.Object);
pathData.Setup(x => x.Action).Returns("myaction");
pathData.Setup(x => x.Controller).Returns("page");
var resolver = new DashboardPathResolver(pathData.Object, repository.Object, mapper.Object, container.Object);
// Act
var data = resolver.ResolvePath(path);
// Assert
Assert.NotNull(data);
Assert.AreEqual("myaction", data.Action);
Assert.AreEqual("page", data.Controller);
}
Run Code Online (Sandbox Code Playgroud)
GetPageByUrl在我的dashboardpathresolver中运行两次,我如何告诉Moq第一次返回null并且pageModel.Ojbect第二次?
如何使用Assert.Throws断言异常的类型和实际的消息措辞.
像这样的东西:
Assert.Throws<Exception>(
()=>user.MakeUserActive()).WithMessage("Actual exception message")
Run Code Online (Sandbox Code Playgroud)
我正在测试的方法抛出多个相同类型的消息,使用不同的消息,我需要一种方法来测试是否根据上下文抛出了正确的消息.
下面的一切都是在 VS2019 中制作的,使用 .NET Framework 4.7 和 NUnit + NUnit3TestAdapter
我创建了一个名为 Exitus.Tests 的程序集,并添加了一些单元测试。但是,为了解决一些我无法解决的 Nuget 问题,我创建了另一个名为 Exitus.UnitTests 的项目,并删除了旧项目中的 once 文件(包括更改命名空间)。
现在新的测试项目在资源管理器中正确显示了 op,但旧项目的“幽灵”仍然存在:
如果我尝试运行测试,输出窗口会显示以下错误:
System.InvalidOperationException:在 Microsoft.VisualStudio.TestWindow.Client.TestContainer.TestContainerProvider 中未找到以下 TestContainer 'C:\Users\xxx\Source\Repositories\Expire\Exitus.Tests\bin\Debug\Exitus.Tests.dll' .d__46.MoveNext() --- 从上一个抛出异常的位置开始的堆栈跟踪结束 --- 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) ) 在 Microsoft.VisualStudio.TestWindow.Controller.TestContainerConfigurationQueryByTestsBase.d__6.MoveNext() (...)
堆栈跟踪要长很多,但奇怪的是第二行,指出它在\Exitus.Tests\bin\Debug\Exitus.Tests.dll. 这是我删除并删除的旧测试项目的名称。我已经在整个项目中搜索了该术语Exitus.Tests,但没有返回任何结果。
有没有办法强行删除这个“幽灵”项目?
我正在尝试完成此异常处理程序:
if (ConfigurationManager.ConnectionStrings["ConnectionString"]==null)
{
string pathOfActiveConfigFile = ...?
throw new ConfigurationErrorsException(
"You either forgot to set the connection string, or " +
"you're using a unit test framework that looks for "+
"the config file in strange places, update this file : "
+ pathOfActiveConfigFile);
}
Run Code Online (Sandbox Code Playgroud)
当我使用nUnit时,这个问题似乎只发生在我身上.
我刚刚安装了VS 2017.我有一个使用NUnit进行测试用例的项目. Ctrl+ R- T不再运行测试,并且测试资源管理器不再找到标有TestCase属性的任何测试用例.
有没有办法让NUnit运行,或者我能找到更新?我从Nuget包管理器重新安装了NUnit到最新版本但没有任何改进.
nunit visual-studio vstest visual-studio-2017 visual-studio-2019
public void SubmitMessagesToQueue_OneMessage_SubmitSuccessfully()
{
var messageServiceClientMock = new Mock<IMessageServiceClient>();
var queueableMessage = CreateSingleQueueableMessage();
var message = queueableMessage[0];
var xml = QueueableMessageAsXml(queueableMessage);
messageServiceClientMock.Setup(proxy => proxy.SubmitMessage(xml)).Verifiable();
//messageServiceClientMock.Setup(proxy => proxy.SubmitMessage(It.IsAny<XmlElement>())).Verifiable();
var serviceProxyFactoryStub = new Mock<IMessageServiceClientFactory>();
serviceProxyFactoryStub.Setup(proxyFactory => proxyFactory.CreateProxy()).Returns(essageServiceClientMock.Object);
var loggerStub = new Mock<ILogger>();
var client = new MessageClient(serviceProxyFactoryStub.Object, loggerStub.Object);
client.SubmitMessagesToQueue(new List<IMessageRequestDTO> {message});
//messageServiceClientMock.Verify(proxy => proxy.SubmitMessage(xml), Times.Once());
messageServiceClientMock.Verify();
}
Run Code Online (Sandbox Code Playgroud)
我开始使用Moq并且有点挣扎.我正在尝试验证messageServiceClient是否正在接收正确的参数,这是一个XmlElement,但我找不到任何方法使它工作.它仅在我不检查特定值时才有效.
有任何想法吗?
部分答案:我找到了一种方法来测试发送给代理的xml是否正确,但我仍然认为这不是正确的方法.
public void SubmitMessagesToQueue_OneMessage_SubmitSuccessfully()
{
var messageServiceClientMock = new Mock<IMessageServiceClient>();
messageServiceClientMock.Setup(proxy => proxy.SubmitMessage(It.IsAny<XmlElement>())).Verifiable();
var serviceProxyFactoryStub = new Mock<IMessageServiceClientFactory>();
serviceProxyFactoryStub.Setup(proxyFactory => proxyFactory.CreateProxy()).Returns(messageServiceClientMock.Object);
var loggerStub …Run Code Online (Sandbox Code Playgroud) 我发现这些似乎是测试异常的两种主要方式:
Assert.Throws<Exception>(()=>MethodThatThrows());
[ExpectedException(typeof(Exception))]
Run Code Online (Sandbox Code Playgroud)
哪个最好?有人提供优势吗?或者仅仅是个人偏好的问题?
我已经为VS2012 + 2013安装了NUnit测试适配器.当我第一次安装适配器时,测试显示出来了,但是他们今天因某种原因停止了显示.构建,重建,清理,重新启动后,测试资源管理器中不显示任何内容.为什么会这样?我正在使用VS2013 Ultimate.
nunit ×10
c# ×7
unit-testing ×5
exception ×2
moq ×2
.net ×1
app-config ×1
asp.net-mvc ×1
assert ×1
assertions ×1
mbunit ×1
mstest ×1
vstest ×1
xunit.net ×1