Tag: unit testing

如何使用Moq测试方法调用顺序

目前我有: [Test] public void DrawDrawsAllScreensInTheReverseOrderOfTheStack() { // Arrange. var screenMockOne = new Mock(); var screenMockTwo = new Mock(); var screens = new List(); screens.Add(screenMockOne.Object); screens.Add(screenMockTwo.Object); var stackOfScreensMock = new Mock(); stackOfScreensMock.Setup(s => s.ToArray()).Returns(screens.ToArray()); var screenManager = new ScreenManager(stackOfScreensMock.Object); // Act. screenManager.Draw(new Mock().Object); // Assert. screenMockOne.Verify(smo => smo.Draw(It.IsAny()), Times.Once(), “Draw was not called on screen mock […]

使用另一个经过测试的function来为实际测试做准备是一种好的unit testing方法吗?

我正在尝试使用NUnit进行unit testing。 目前,我正在编写一个简单的测试来熟悉语法和unit testing的方法。 但我不确定我是否通过以下测试做得对: 被测试的类包含一个包含水果名称的字符串列表,其中可以通过class_under_test.addNewFruit(…)添加新的水果名称。 因此,为了测试addNewFruit(…)的function,我首先使用该方法将新字符串添加到列表中(例如“Pinapple”),并在下一步中validation列表是否包含此新字符串。 我不确定这是否是测试方法function的好方法,因为我依赖于另一个函数的响应(我已经在之前的unit testing中测试过)。 这是测试此function的方法,还是有更好的解决方案? public void addNewFruit_validNewFruitName_ReturnsFalse() { //arrange string newFruit = “Pineapple”; //act class_under_test.addNewFruit(newFruit); bool result = class_under_test.isInFruitList(newFruit); //assert Assert.That(!result); }

使用AutoFixture创建递归树

我刚刚开始使用AutoFixture并拥有这个半复杂的数据结构,我想创建一些标本。 在我正在进行的测试中,我不太关心数据结构的内容。 我只想要合理的默认值。 此数据结构的一部分是递归树。 更具体地说,一个类包含一些其他类的集合,其中包含自身的子列表。 类似于: public class A { private IEnumerable bNodes; public A(IEnumerable bNodes) { this.bNodes = bNodes; } } public class B { private IEnumerable children; public B(IEnumerable children) { this.children = children; } } 让我们假设我不能因各种原因轻易改变这种结构。 如果我要求我的夹具创建一个ThrowingRecursionBehavior将开始咆哮B是递归的。 如果我用OmitOnRecursionBehavior替换ThrowingRecursionBehavior,我会得到一个ObjectCreateException。 如果我尝试类似:fixture.Inject(Enumerable.Empty()); 我从DictionaryFiller获得“已添加相同键的项目”。 如果我用NullRecursionBehavior替换ThrowingRecursionBehavior,也会发生同样的事情。 我想要几件事。 用空的B列表创建A样本的最佳方法是什么? 创建一个A标本的最佳方法是什么,其中包含一些含有少数几个孩子(一棵小树)的B孩子的B? 对于我的遗愿,指定一些递归深度可能会很好,之后使用Enumerable.Empty(或零大小的数组/ List或甚至为null)。 我知道AutoFixture可以非常灵活地扩展。 因此,我认为应该可以创建一些完全符合这一要求的样本构建器。 事实上,我会尝试使用自定义的ISpecimenBuilder,但也许有人已经拥有了一个更智能的解决方案。 例如,在RecursionGuard中修改此行是否有意义: public object […]

在c#中对HTTP请求进行unit testing

我正在编写一些调用Web服务的代码,读取响应并对其执行某些操作。 我的代码名义上看起来像这样: string body = CreateHttpBody(regularExpression, strategy); HttpWebRequest request = (HttpWebRequest)WebRequest.Create(_url); request.Method = “POST”; request.ContentType = “text/plain; charset=utf-8”; using (Stream requestStream = request.GetRequestStream()) { requestStream.Write(Encoding.UTF8.GetBytes(body), 0, body.Length); requestStream.Flush(); } using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) { byte[] data = new byte[response.ContentLength]; using (Stream stream = response.GetResponseStream()) { int bytesRead = 0; while (bytesRead < data.Length) { […]

unit testing/集成在Visual Studio 2013中使用HttpClient测试Web API

我很难用Visual Studio 2013测试我的API控制器。我的解决方案有一个Web API项目和一个测试项目。 在我的测试项目中,我有一个unit testing: [TestMethod] public void GetProduct() { HttpConfiguration config = new HttpConfiguration(); HttpServer _server = new HttpServer(config); var client = new HttpClient(_server); var request = new HttpRequestMessage { RequestUri = new Uri(“http://localhost:50892/api/product/hello”), Method = HttpMethod.Get }; request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue(“application/json”)); using (var response = client.SendAsync(request).Result) { Assert.AreEqual(HttpStatusCode.OK, response.StatusCode); var test = response.Content.ReadAsAsync().Result; } […]

使用静态记录器,静态助手类进行dependency injection

我有一个静态类,它调用静态Logger类, 例如 static class DoesStuffStatic { public static void DoStuff() { try { //something } catch(Exception e) { //do stuff; Logger.Log(e); } } } static class Logger { public static void Log(Exception e) { //do stuff here } } 如何将Logger注入我的静态类? 注意:我已经通过示例阅读了.NET中的dependency injection? ,但这似乎使用实例记录器。

Server.MapPath的unit testing

我有一个方法。 从硬盘检索文档。 我无法通过unit testing来测试这个。 它总是抛出exception无效的空路径或其他东西。 如何测试。 我暂时创建了unit testing会话。 但我不能为这个Server.MapPath。 怎么做 ?

如何将Cookie添加到WebRequest?

我试图对一些代码进行unit testing,我需要替换它: HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create( uri ); httpWebRequest.CookieContainer = new CookieContainer(); 同 WebRequest webRequest = WebRequest.Create( uri ); webRequest.CookieContainer = new CookieContainer(); 基本上,如何在不使用HttpWebRequest的情况下将cookie添加到请求中?

如何对返回匿名对象的ASP.NET Core MVC控制器进行unit testing?

我在unit testing返回匿名对象的ASP.NET Core MVC控制器时遇到了麻烦。 unit testing在单独的项目中设置,并直接从主项目调用控制器方法。 控制器方法返回IActionResult但通常这些是OkObjectResult和BadRequestObjectResult对象,它们被转换为具有适当HTTP状态代码的JSON响应。 匿名对象作为ObjectResult对象的构造函数参数传递,我正在尝试对其进行断言(可通过ObjectResult.Value访问)。 我发现这个问题(我如何访问asp.net 5中的内部 )有一个答案,说使用动态和添加 [assembly: InternalsVisibleTo(“Namespace”)] 到AssemblyInfo.cs,允许测试项目访问匿名对象的内部对象属性。 但是,最新版本的ASP.NET Core MVC没有AssemblyInfo.cs,并且在链接问题的答案中建议添加一个也不起作用。 是否现在有一个不同的位置来添加InternalsVisibleTo或我错过了什么?

如何在字符串比较中忽略UTF-8字节顺序标记?

我在使用Visual Studio 2010比较C#4.0中的unit testing中的字符串时遇到问题。同样的测试用例在Visual Studio 2008中正常工作(使用C#3.5)。 这是相关的代码段: byte[] rawData = GetData(); string data = Encoding.UTF8.GetString(rawData); Assert.AreEqual(“Constant”, data, false, CultureInfo.InvariantCulture); 在调试此测试时, data字符串肉眼看来包含与文字完全相同的字符串。 当我调用data.ToCharArray() ,我注意到字符串data的第一个字节是值65279 ,它是UTF-8字节顺序标记。 我不明白的是为什么Encoding.UTF8.GetString()保持这个字节。 如何让Encoding.UTF8.GetString() 不将字节顺序标记放在结果字符串中? 更新:问题是GetData()从磁盘读取文件,使用FileStream.readbytes()从文件中读取数据。 我通过使用StreamReader并使用Encoding.UTF8.GetBytes()将字符串转换为字节来纠正这个问题,这应该是它本来应该做的! 谢谢你的帮助。