使用 Fakes 的单元测试给出 IConvertible 异常

Unit testing using Fakes gives IConvertible exception

我有什么

界面:

public interface IDocDbRepository
{
    Task<JObject> UpdateDocumentAsync(JObject updatedDocument);
}

实施:

public async Task<JObject> UpdateDocumentAsync(JObject updatedDocument)
{
    if (updatedDocument == null)
    {
        throw new ArgumentNullException(nameof(updatedDocument));
    }

    var response = await this.documentDBClient.ReplaceDocumentAsync(UriFactory.CreateDocumentUri(this.dbName, this.collectionName, updatedDocument["id"].Value<string>()), updatedDocument).ConfigureAwait(false);
    return JObject.Parse(response.Resource.ToString());
}

await行出现异常

单元测试:

static Guid docGuid = Guid.NewGuid();

[TestMethod]
public async Task TestMethod2()
{
    var jObject = new JObject { { "id", docGuid }, { "studentId", "1" }, { "courseId", "Ph" } };

    // Arrange
    var docClient = new ShimDocumentClient();
    ShimDocumentClient.AllInstances.CreateDocumentAsyncUriObjectRequestOptionsBoolean =
       (instance, uri, document, options, disableAutomaticGeneration) => Task.FromResult(new ResourceResponse<Document>(new Document() { Id = docGuid.ToString() }));

    // Act
    var documentRepository = new DocDbRepository(endPointUri, accountKey, dbName, collectionName);
    try{
    var response = await documentRepository.UpdateDocumentAsync(jObject).ConfigureAwait(false);
    }
    catch(Exception ex){}

    // Assert
    Assert.AreEqual(response.Count, 1);
}

测试未超出 UpdateDocumentAsync 部分并退出并显示此消息:

at System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider)
at Newtonsoft.Json.Linq.Extensions.Convert[T,U](T token)
at Newtonsoft.Json.Linq.Extensions.Value[T,U](IEnumerable`1 value)
at Newtonsoft.Json.Linq.Extensions.Value[U](IEnumerable`1 value)
at Common.DataAccess.DocumentDb.DocDbRepository.<UpdateDocumentAsync>d__12.MoveNext() in C:\Common\Common.DataAccess.DocumentDb\DocDbRepository.cs:line 196
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task)
at System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1.ConfiguredTaskAwaiter.GetResult()
at Common.DataAccess.DocumentDb.Tests.DocDbUtilityTests.<TestMethod2>d__9.MoveNext() in C:\Common\Common.DataAccess.DocumentDb.Tests\DocDbUtilityTests.cs:line 113

这是我第一次使用 Fakes 框架。 非常感谢任何帮助。

提前致谢。 问候。

这似乎是您的序列化代码有问题。具体来说,这个声明:

updatedDocument["id"].Value<string>()

Value 扩展方法似乎要求源实现 IConvertible 接口,Guid 未实现该接口。