gpt4 book ai didi

unit-testing - 测试 future 和流,我如何创建一个假的上下文?

转载 作者:行者123 更新时间:2023-12-03 11:34:05 25 4
gpt4 key购买 nike

我正在尝试找出如何对我的 Stream 的 fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<Self::Item>> {todo!()} 进行单元测试

它需要一个上下文 cx传递给嵌套流。我的测试和测试代码可以没有,但我必须提供一些才能进行测试。

Rust playground :

use futures::ready;
use futures::stream::Stream;
use pin_project::pin_project;
use std::collections::VecDeque;
use std::pin::Pin;
use std::task::{Context, Poll}; // 0.4.22

#[pin_project]
pub struct MyStream<T>(#[pin] T);

impl<T: Stream> Stream for MyStream<T> {
type Item = ();
fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<Self::Item>> {
let _ignored = ready!(self.project().0.poll_next(cx));
Poll::Ready(Some(()))
}
}

#[test]
fn test1() {
let setup = TestStream::from(vec![Poll::Ready(Some(true))]);
let sut = MyStream(setup);

// where do I get a fake Context<>?
assert_eq!(Pin::new(&mut sut).poll_next(cx), Poll::Ready(Some(())))
}

#[pin_project]
struct TestStream<I> {
items: VecDeque<Poll<Option<I>>>,
}
impl<T: IntoIterator<Item = Poll<Option<I>>>, I> From<T> for TestStream<I> {
fn from(from: T) -> Self {
TestStream {
items: from.into_iter().collect(),
}
}
}
impl<I> Stream for TestStream<I> {
type Item = I;
fn poll_next(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<Option<Self::Item>> {
if let Some(item) = self.project().items.pop_front() {
item
} else {
Poll::Ready(None)
}
}
}

最佳答案

我终于找到了 noop waker:

Playground :

#[test]
fn test1() {
let waker = futures::task::noop_waker_ref();
let mut cx = std::task::Context::from_waker(waker);
let setup = TestStream::from(vec![Poll::Ready(Some(true))]);
let mut sut = MyStream(setup);

assert_eq!(Pin::new(&mut sut).poll_next(&mut cx), Poll::Ready(Some(())))
}

感谢@rodrigo 的正确答案。

关于unit-testing - 测试 future 和流,我如何创建一个假的上下文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63263880/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com