- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想测试从异步方法返回的类型是否正确。此方法在依赖类中使用另一个异步方法。依赖类实现了这个接口(interface):
Task<string> DownloadStringAsync(string url);
我要测试的方法是这样的:
public async Task<T> GetData<T>(string url) where T : class , new()
{
var jsonData = await _webClientWrapper.DownloadStringAsync(url);
if (string.IsNullOrEmpty(jsonData))
return new T();
try
{
return await JsonConvert.DeserializeObjectAsync<T>(jsonData);
}
catch (JsonException inner)
{
throw new JsonConvertException("Error converting Json string", inner) { JsonString = jsonData };
}
}
使用 xUnit 和 Moq 测试成功:
public class Testes
{
private const string ValidJson = "{'Nome':'Rogerio','Idade':'51'}";
protected static JsonWebServiceClassProvider JsonWebServiceClassProvider;
private static Mock<IWebClientWrapper> _webClientWrapperMoq;
private static FakeClassFromJson _resultClass;
[Fact]
public async static void When_calling_GetData_it_should_return_a_class_of_same_type()
{
_webClientWrapperMoq = new Mock<IWebClientWrapper>();
_webClientWrapperMoq
.Setup(w => w.DownloadStringAsync(Moq.It.IsAny<string>()))
.Returns(Task.FromResult(ValidJson));
JsonWebServiceClassProvider = new JsonWebServiceClassProvider(_webClientWrapperMoq.Object);
_resultClass = await JsonWebServiceClassProvider
.GetData<FakeClassFromJson>(Moq.It.IsAny<string>());
Assert.IsType<FakeClassFromJson>(_resultClass);
}
}
使用 MSpec 和 Moq 进行测试:
[Subject("JsonWebServiceClassProvider")]
public class When_calling_GetData_with_a_valid_Json_Service_Url
{
private const string ValidJson = "{'Nome':'Rogerio','Idade':'51'}";
protected static JsonWebServiceClassProvider JsonWebServiceClassProvider;
protected static Mock<IWebClientWrapper> WebClientWrapperMoq;
protected static FakeClassFromJson ResultClass;
Establish context = () =>
{
WebClientWrapperMoq = new Mock<IWebClientWrapper>();
WebClientWrapperMoq
.Setup(w => w.DownloadStringAsync(Moq.It.IsAny<string>()))
.Returns(Task.FromResult(ValidJson));
JsonWebServiceClassProvider = new JsonWebServiceClassProvider(WebClientWrapperMoq.Object);
};
Because of = () => ResultClass = JsonWebServiceClassProvider
.GetData<FakeClassFromJson>(Moq.It.IsAny<string>())
.Await();
It should_return_a_class_of_same_type = () => ResultClass.ShouldBeOfType<FakeClassFromJson>();
}
它也因这些 Because
语句而失败
Because of = () => JsonWebServiceClassProvider
.GetData<FakeClassFromJson>(Moq.It.IsAny<string>())
.ContinueWith(task => ResultClass = task.Result)
.Wait();
Because of = () => ResultClass = JsonWebServiceClassProvider
.GetData<FakeClassFromJson>(Moq.It.IsAny<string>())
.Result;
此行失败并出现 NullReferenceException
public async Task<T> GetData<T>(string url) where T : class , new()
{
string jsonData = await _webClientWrapper.DownloadStringAsync(url);
// ...
}
已解决
在等待响应的同时,进行了一些重构,瞧瞧!我用 Establish
语句创建了一个基类,并在那里启动了模拟对象:
public class JsonWebServiceClassProviderSpecs
{
protected static JsonWebServiceClassProvider JsonWebServiceClassProvider;
protected static Mock<IWebClientWrapper> WebClientWrapperMoq;
Establish context = () =>
{
WebClientWrapperMoq = new Mock<IWebClientWrapper>();
JsonWebServiceClassProvider = new JsonWebServiceClassProvider(WebClientWrapperMoq.Object);
};
}
然后我更新了测试类:
[Subject("JsonWebServiceClassProvider")]
public class When_ask_data_with_a_valid_Json_Service_Url : JsonWebServiceClassProviderSpecs
{
private const string ValidJson = "{'Nome':'Rogerio','Idade':'51'}";
protected static FakeClassFromJson ResultClass;
Establish context = () =>
{
WebClientWrapperMoq
.Setup(w => w.DownloadStringAsync(Moq.It.IsAny<string>()))
.Returns(Task.FromResult(ValidJson));
};
Because of = () => ResultClass = JsonWebServiceClassProvider
.GetData<FakeClassFromJson>(Moq.It.IsAny<string>())
.Await();
It should_return_a_class_of_same_type = () => ResultClass.ShouldBeOfType<FakeClassFromJson>();
}
最佳答案
这是您的规范的精简版。没有 NullReferenceException
被看到。注意:
It
不检查 AwaitResult
的类型而是得到包裹 Task.Result
Moq.It<string>.Any...
在Because
,噪音太大了。如果该参数被忽略,请使用传达该事实的值。(只是一些文本,以便下面的代码块格式正确。)
using System.Diagnostics;
using System.Threading.Tasks;
using Machine.Specifications;
using Moq;
using YourApp;
using It = Machine.Specifications.It;
namespace YourApp
{
class Foo
{
}
public interface IWebClientWrapper
{
Task<string> DownloadStringAsync(string url);
}
public class JsonWebServiceClassProvider
{
readonly IWebClientWrapper _webClientWrapper;
public JsonWebServiceClassProvider(IWebClientWrapper webClientWrapper)
{
_webClientWrapper = webClientWrapper;
}
public async Task<T> GetData<T>(string url) where T : class, new()
{
string jsonData = await _webClientWrapper.DownloadStringAsync(url);
Debug.Assert(jsonData != null);
return new T();
}
}
}
namespace Specs
{
public class When_calling_GetData_with_a_valid_Json_Service_Url
{
const string ValidJson = "{'Nome':'Rogerio','Idade':'51'}";
static JsonWebServiceClassProvider JsonWebServiceClassProvider;
static Mock<IWebClientWrapper> Wrapper;
static AwaitResult<Foo> Result;
Establish context = () =>
{
Wrapper = new Mock<IWebClientWrapper>();
Wrapper.Setup(w => w.DownloadStringAsync(Moq.It.IsAny<string>()))
.Returns(Task.FromResult(ValidJson));
JsonWebServiceClassProvider = new JsonWebServiceClassProvider(Wrapper.Object);
};
Because of = () => Result = JsonWebServiceClassProvider.GetData<Foo>("ignored").Await();
It should_return_a_class_of_same_type = () => Result.AsTask.Result.ShouldBeOfType<Foo>();
}
}
关于c# - 为什么在使用 MSpec/Moq 测试此异步方法时会出现 NullReferenceException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17503287/
我有一个简单的 MSpec 测试,其中我将空值传递给 string 中的方法参数(类型 Because)。声明。然后我检查 It 中是否抛出了异常。声明。 Because _of = () => _e
在编写一些 MSpec BDD 测试时,我遇到了一个场景,我预计会失败的测试正在通过,但只有在我运行所有测试时才会通过。当我单独运行测试时,它按预期失败了。经过一些调查,我发现在第二个测试运行之前,在
我正在使用 MSpec 来驱动我的浏览器测试,但我总是忘记关闭浏览器。与其在每个环境中都进行清理,不如在全局范围内应用它? 最佳答案 您可以继承规范。在所有子清理之后调用基本规范类中定义的清理。 关于
我正在尝试使用 Mspec 的 ShouldBeOfType()断言扩展方法,但智能感知说它找不到它。我正在使用 MSpec v0.7.0。我尝试使用 Nuget 重新安装,但没有成功。 [Subje
我使用 mspec 进行测试,并在测试中为我的数据库使用 SQLite x86 进行 NHiernate 设置。问题是,当我使用 mspec r# 运行程序运行测试时,一切正常,但从控制台运行它会出现
我正在为我的最新项目使用 MSpec,总的来说我对它非常满意。但是,当我的测试并行运行时,我确实遇到了并发问题,我想知道是否有人遇到过这个问题,或者更好的是,有解决方案? MSpec 严重依赖静态方法
我一直在阅读 README for the MSpec project ,尽管它做了很多关于它是什么和(它不是什么)的解释,并在其自身和 RSpec 之间做了一些对比,但没有关于为什么/strong>
我在我的移动服务应用程序中使用 MSpec。我想验证当传入的参数为空时,是否调用了我的自定义记录器上的方法。这可能吗? 代码 if (someOrg == null || target == null
可以执行 mspec测试 appharbor除了添加构建操作? 最佳答案 现在可以在 AppHarbor 上运行 Machine.Specifications (MSpec) 测试。 关于.net -
作为 BDD 和 MSpec 的初学者,我仍然不太确定与 BDD 相关的最佳实践和良好习惯,尤其是与 MSpec 相关的最佳实践。 下面的例子可以改进吗?它是否遵循最佳实践和良好习惯? 我的规范类和行
我正在尝试在测试前运行一些初始化代码。我试过 suggestions in other questions ,但它似乎不起作用。我的域模型通过以下类引发事件: public static class
我们有以下设置: 团队城市 v8.1.2 .NET 2013 解决方案与几个不同的 C# 项目(ASP.NET MVC,库、测试项目等) 我们 95% 的测试都是 MSpec,但我们也有一些 NUni
我有这个方法签名:List Parse(string[] lines) ITMData有 35 个属性。 您将如何有效地测试这样的解析器? 问题: 我应该加载整个文件吗(我可以使用 System.IO
我应该使用哪种方法来断言两个列表包含与 MSpec 相同的对象? 最佳答案 您可以使用 ShouldContainOnly(IEnumerable)扩展方法。 因此,如果您有 2 个列表,listA和
我正在编写我的第一个 MSpec 规范,我需要一些指导。我将规范留在“待定”状态,但上下文已填写。有什么需要改进的地方吗? 作为引用,这是故事和第一个场景: Story: "Blog admin lo
我有以下两个单元测试:一个使用MSTest,另一个使用机器规格。据我所知,它们的行为应相同。但是,虽然第一个通过了NCrunch和ReSharper测试运行程序,但第二个却没有通过ReSharper。
我已经使用 MSpec 有一段时间了,我真的很喜欢它。我发现要让 ReSharper 识别我的规范,我需要使用 SubjectAttribute . 不过我想知道,放在 [Subject()] 中的最
我从 codebetter teamcity 站点获得了最新的 mspec,并按照建议安装了 Resharper5.1 runner。转轮和注释在 resharper 选项对话框中显示良好。 现在,即
我正在将 Mspec 与 FakeItEasy 结合使用,但我不断收到不确定的测试结果。我尝试注释掉我的假设置代码,甚至注释掉被测方法的实际调用。我也无法调试测试。我也只是尝试了这样一个简单的测试:
刚刚发现 MSpec,并想尝试一下。但是,除了一些快速教程之外,我找不到任何详细的文档 - 它们是否存在? 最佳答案 由于 MSpec 是在 RSpec 之后建模的,因此您可以使用 rspec dsl
我是一名优秀的程序员,十分优秀!