6

Trong nghiên cứu của tôi về việc quay lại các giao dịch trong EF4, có vẻ như mọi người đều đề cập đến this blog post hoặc đưa ra một lời giải thích tương tự. Trong kịch bản của tôi, tôi muốn làm điều này trong một kịch bản thử nghiệm đơn vị nơi tôi muốn khôi phục thực tế mọi thứ tôi làm trong ngữ cảnh thử nghiệm đơn vị của mình để giữ cập nhật dữ liệu trong cơ sở dữ liệu.). Để làm được điều này, tốt nhất là nên làm theo kế hoạch sau đây? Tôi có thiếu một số khái niệm hoặc bất cứ điều gì khác lớn với điều này (ngoài các chức năng SetupMyTestPerformMyTest của chúng tôi sẽ không thực sự tồn tại theo cách đó)?Làm thế nào để rollback trong EF4 cho Unit Test TearDown?

[TestMethod] 
public void Foo 
{ 
    using (var ts = new TransactionScope()) 
    { 
    // Arrange 
    SetupMyTest(context); 

    // Act 
    PerformMyTest(context); 
    var numberOfChanges = context.SaveChanges(SaveOptions.AcceptAllChangesAfterSave); 
    // if there's an issue, chances are that an exception has been thrown by now. 

    // Assert 
    Assert.IsTrue(numberOfChanges > 0, "Failed to _____"); 

    // transaction will rollback because we do not ever call Complete on it 
    } 
} 
+0

Hmm, trong EF4, dường như quá tải SaveChanges (sai) đã không được chấp nhận. Có vẻ như SaveChanges (SaveOptions.AcceptAllChangesAfterSave) là sự thay thế cho nó vì vậy tôi đang thực hiện cập nhật đó trong câu hỏi ban đầu của mình. – Jaxidian

Trả lời

10

Chúng tôi sử dụng TransactionScope cho việc này.

private TransactionScope transScope; 

    #region Additional test attributes 
    // 
    // Use TestInitialize to run code before running each test 
    [TestInitialize()] 
    public void MyTestInitialize() 
    { 
     transScope = new TransactionScope(); 
    } 

    // Use TestCleanup to run code after each test has run 
    [TestCleanup()] 
    public void MyTestCleanup() 
    { 
     transScope.Dispose(); 
    } 

Điều này sẽ khôi phục mọi thay đổi được thực hiện trong bất kỳ thử nghiệm nào.

+0

Bạn có gặp vấn đề với giao dịch treo khi viết/gỡ lỗi các bài kiểm tra không? Tôi muốn làm điều này với một cơ sở dữ liệu được chia sẻ nhưng tôi không muốn làm điều này theo cách mà chúng tôi liên tục xử lý các giao dịch treo. – Jaxidian

+0

Bạn nhận được các giao dịch treo nếu bạn không thực hiện xử lý. Nếu không vứt bỏ giao dịch sẽ treo cho đến khi nó hết thời gian chờ. –

+0

Bất kỳ cơ hội nào bạn có thể cập nhật mẫu mã của mình để hiển thị thử nghiệm cơ bản trông như thế nào? Là 'SaveChanges (SaveOptions.AcceptAllChangesAfterSave)' đúng cách để đi về điều này hay không? – Jaxidian

Các vấn đề liên quan