代码之家  ›  专栏  ›  技术社区  ›  Codehelp

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

  •  -1
  • Codehelp  · 技术社区  · 8 年前

    我所拥有的

    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());
    }
    

    异常发生在等待行中。

    单元测试:

    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);
    }
    

    测试不会超出UpdateDocumentSync部分,并以以下消息退出:

    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框架。 非常感谢任何帮助。

    提前谢谢。 当做

    1 回复  |  直到 8 年前
        1
  •  0
  •   Jack A.    8 年前

    这似乎是序列化代码的问题。具体而言,本声明:

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

    这个 Value 扩展方法似乎要求源实现 IConvertible 接口,该接口不是由 Guid .