2011-05-16 17 views
28

olmadan test edilmiş birimde etkinliği yükseltmelidir Enjekte edilen görüntünün bir olayını ekleyen bir sunum sınıfım var. Şimdi, olay yerinde doğru tepki gösteren sunucuyu test etmek istiyorum. Moq - mock.Raise, Test

Bu

görünüşüdür arayüzü IView olup:

public interface IView 
{ 
    event EventHandler MyEvent; 
    void UpdateView(string test); 
} 

Bu görünüm uygulanması IView ist

public partial class MyView : IView 
{ 
    public event EventHandler MyEvent; 

    public MyView() 
    { 
     this.combo.SelectedIndexChanged += this.OnSelectedIndexChanged; 
    } 

    public void UpdateView(string test) 
    { 
     this.textBox.Text = test; 
    } 

    private OnSelectedIndexChanged(Object sender, EventArgs e) 
    { 
     if (this.MyEvent != null) 
     { 
      this.MyEvent(sender, e); 
     } 
    } 
} 

Bu test edilen sunum ist: Bu test, fikstür

public class MyPresenter 
{ 
    private IView _view; 
    public MyPresenter(IView view) 
    { 
     this._view = view; 
     this._view.MyEvent += this.OnMyEvent; 
    } 

    private void OnMyEvent(Object sender, EventArgs e) 
    { 
     this._view.UpdateView(); 
    } 
} 

MyPresenter'ın test edilmesi:

[TestClass] 
public class MyPresenterFixture() 
{ 
    private MyPresenter testee; 
    private Mock<IView> mockView; 

    [TestMethod] 
    public void ShouldReactOnMyEvent() 
    { 
     // arrange 
     this.mockView = new Mock<IView>(MockBehavior.Strict); 
     this.testee = new MyPresenter(this.mockView.Object); 

     // act 
     this.mockView.Raise(mock => mock.MyEvent += null); // this does not fire 

     // assert and verify 
     this.mockView.Verify(mock => mock.UpdateView(It.IsAny<string>()); 
    } 
} 

Ad 4 kullanıyorum. İstediğimi yapmak mümkün mü?

Saygılarımızla Yannik

Bir dize kabul olarak UpdateView() ilan ettik, ancak sunucu çağırma bir dize argümanı (veya varsayılan) yok

cevap

57

Argümanı geçmeniz gerekmiyor mu? Etkinlik imzanız,
(object sender, EventArgs e) olan EvenHandler'dır.

this.mockView.Raise(mock => mock.MyEvent += null, new EventArgs()); 

Burada belirttiğiniz aşırı yükü hiç kullanmamıştım ... yine de doğru görünmüyor.

+2

+1. Veya EventArgs.Empty içinde geçirin. Gönderen dışında herhangi bir parametreyi Mock.Raise'e argüman olarak iletmeniz gerekir. Http://madcoderspeak.blogspot.com/2010/01/meet-frameworks-rhino-v-moq-v-jmock.html#scen8 http://code.google.com/p/moq/wiki/QuickStart – Gishu

3

:

Çağırma:

private void OnMyEvent(Object sender, EventArgs e) 
{ 
    this._view.UpdateView(); 
} 

Beyanı:

public void UpdateView(string test) 
{ 
    this.textBox.Text = test; 
} 

Ver Kısa süre önce bir kalmadan görünümü ile etkileşimi doğrulayabildi Sonra

public interface IView 
{ 
    void UpdateText(string test); 
} 

public class MyPresenter 
{ 
    private readonly IView _view; 
    public MyPresenter(IView view) 
    { 
     _view = view; 
    } 

    private void SelectItem(string item) 
    { 
     _view.UpdateText(item); 
    } 
} 

public partial class MyView : IView 
{ 
    private readonly MyPresenter _presenter; 

    public MyView() 
    { 
     _presenter = new MyPresenter(this); 
     combo.SelectedIndexChanged += OnSelectedIndexChanged; 
    } 

    public void UpdateText(string test) 
    { 
     textBox.Text = test; 
    } 

    private OnSelectedIndexChanged(Object sender, EventArgs e) 
    { 
     _presenter.SelectItem(combo.SelectedItem); 
    } 
} 

: ification: için

mockView.Verify(mock => mock.UpdateView(It.IsAny<string>()); 

FWIW, ben senin görünümünde olay biraz hantal olduğunu düşünüyorum, basit bir değişiklik olacağını Bununla başa çıkmak için ek olay:

presenter.SelectItem("Burrito!"); 

    mockView.Verify(mock => mock.UpdateView("Burrito!"); 
+0

Merhaba Ritch, görüşleriniz için teşekkürler. Sunucular yönteminde özel geçersiz OnMyEvent (Object sender, EventArgs e) {this._view.UpdateView(); } UpdateView girişi eksik. Ne yazık ki yaklaşımınız bizim için işe yaramıyor çünkü saf pasif görünüm uyguluyoruz ve görüş, sunucusunu asla bilemez. Şerefe – Yannik

+1

Bu bir pasif görüntüdür. –