我用Moq.我已经嘲笑了一个类似于以下方法的类:
public async Task DoSomething()
{
// do something...
}
Run Code Online (Sandbox Code Playgroud)
我设置如下:
SomeMock.Setup(x => x.DoSomething())
.Callback(() => ... ))
.Returns(Task.FromResult(default(int)));
Run Code Online (Sandbox Code Playgroud)
我不喜欢最后一行:.Returns(Task.FromResult(default(int))).有没有办法以更优雅的方式设置异步返回.我知道有一种方法,ReturnsAsync()但它有一个参数.我的方法返回,Task所以我没有参数ReturnsAsync().
我想测试一些代码:
public ViewModel FillClientCreateViewModel(ViewModel model){
model.Phone = new Phone { Name = "Test"};
model.Phone = _entityInitializer.FillViewModel(model.Phone);
}
Run Code Online (Sandbox Code Playgroud)
我还想设置FillViewModel以返回我给它的相同对象.
我的测试:
entityInitMock.Setup(x => x.FillViewModel(It.IsAny<PhoneViewModel>())).Returns(It.IsAny<PhoneViewModel>());
var result = TestedInstance.FillClientCreateViewModel(CreateViewModel);
result.Phone.Name.ShouldBe("Test");
Run Code Online (Sandbox Code Playgroud)
但在这种情况下,我的测试失败了 - 因为result.Phone.Name被我的模拟器清理干净了.
我如何设置模拟只是给我相同的对象,我给它.
我正在尝试使用Moq来测试WebAPI控制器和Redis数据库之间的集成,使用StackExchange.Redis客户端,并且无法解决如何在包含回调或其他一些断言的模拟异步方法上设置可验证的期望行为.
通常,我使用以下语法:
const string KEY = "some_key";
var db = new Mock<IDatabase>();
db.Setup(d => d.HashSetAsync(KEY, It.IsAny<HashEntry[]>(),It.IsAny<CommandFlags>()))
.Callback<RedisKey,HashEntry[],CommandFlags>((key, hash, flags) => {
hash.ShouldContain(entry => entry.Name == "customerid");
hash.ShouldContain(entry => entry.Name == "quotenumber");
})
.Verifiable();
Run Code Online (Sandbox Code Playgroud)
但是这给了我:
'Moq.Language.Flow.IReturnsThrows <StackExchange.Redis.IDatabase,System.Threading.Tasks.Task>'不包含'Verifiable'的定义,也没有扩展方法'Verifiable'接受'Moq.Language'类型的第一个参数可以找到.Flow.IReturnsThrows'(你是否缺少using指令或程序集引用?)
如果我改变db.HashSetAsync,以db.HashSet在Setup调用,它将按预期工作.似乎在常规方法上设置Callback会返回一个ICallbackResult但在异步方法调用上设置回调会返回IReturnsThrows- 而且我不确定如何将其中一个标记为可验证.有任何想法吗?
我试图Mock一个Interface具有单个Task<string>方法.
这里的Q相同,但我似乎无法让代码对我有利:在Moq Framework中设置异步任务回调
我的界面如下所示:
public interface IHttpClient
{
Task<string> GetStringAsync(string uri);
}
Run Code Online (Sandbox Code Playgroud)
我试图嘲笑这样:
var mockHttp = new Mock<IHttpClient>();
mockHttp.Setup(m => m.GetStringAsync("aPretendUrl")).ReturnsAsync("Some sort of string");
Run Code Online (Sandbox Code Playgroud)
我发现结果GetStringAsync是null
在注入此实例的控制器中,我将其称为:
string responseData = await _client.GetStringAsync(url);
也试着
string responseData = _client.GetStringAsync(url).Result;
responseData是null在所有情况下.
我确信我错过了一些简单的事情.单元测试仍然是新的
谁能指出我哪里出错了?
更新
完整的单元测试如下所示:
[Test]
public void Given_EController_Called_With_unknown_pedi_Returns_NotFound()
{
// Arrange
AppSettings settings = new AppSettings()
{
DataWarehouseAPI = "http://myurl.com"
};
Mock<IOptionsSnapshot<AppSettings>> mockSettings = new Mock<IOptionsSnapshot<AppSettings>>();
mockSettings.Setup(m => m.Value).Returns(settings);
var …Run Code Online (Sandbox Code Playgroud)